发布网友 发布时间:2022-04-29 11:33
共6个回答
热心网友 时间:2022-04-14 15:57
关于使用分配的内存,调用free后的内存状态解释如下:
1.当调用free来释放分配的内存时,它表明该内存可以被其他人使用,也就是说,它可以在其他地方调用malloc之后分配给内存
2.对于释放后内存中的数据数量,我们只能认为是脏数据;换句话说,这部分数据可能存在并保持原始值,也可能被清空或修改为其他值;
这表明有许多可能的情况下,因此,内存被释放后,除了分配指针赋值的空,也要小心不要参考这部分的内存,不要试图得到这部分的价值,这些已经是非法的。
扩展资料:
在程序中使用自由释放,否则内存将不会被释放。
C将不会被释放。所谓的动态内存是malloc系列函数所请求的内存,只有在程序中使用free时才会释放。
标准库中malloc函数的实现原理。要理解malloc的内存存储结构,与全局变量不同,malloc不在编译器编译时分配内存空间,而只在调用malloc函数时才分配内存空间。有时我在中间调用free函数来释放空间。
热心网友 时间:2022-04-14 17:15
楼上已经回答很好了,我就简单总结一下:
比如有一个 int* p 的指针,申请内存: p = (int*)malloc(sizeof(int));
你就可以对“p”做这样的操作:*p = 54;
使用 free(p); 那么就是切断了 p 对所分配内存的使用权,也就是说其他人是可以使用这块内存的。但是 p 保存的地址仍然存在,你再 *p = 55; 这样操作,必定会造成非法访问,因为 p 失去了对保存的地址的使用权。
如果没有 free(p); ,那么指针 p 所申请的内存,将不会被其他人使用。
当你做了 p = NULL; 这个操作,只是你所写的整个代码程序占用了这块由 指针 p 所申请的内存,导致了你不再使用这块内存,别人也无法使用这块内存,造成内存泄漏。
使用 free(p); 释放内存后, p 这个指针变量仍然可以使用,重新给指针 p 一个新地址(注意:这是赋值一个新地址) 或 重新为指针 p 申请一块内存。
热心网友 时间:2022-04-14 18:50
前面已经有大神回答了,我这里刚好有个例子来说明一下。
我用VS2015写了一段释放链表所有节点的代码,下面看正确的部分
VOID DestoryList()然后,下面是错误的代码:
VOID DestoryList()注意到了没?我在free(pstCurNode)之后,继续pstCurNode这个变量,但是只要一使用,程序就会崩溃,经过调试后发现,pstCurNode->pstNext这个指针,在free前后值会发生变化,这就很明显了,所以我就用一个临时变量记录原始的指针值,并在最后才free此空间。
换句话说,一旦free某块内存后,你最多只能将指向这块内存的地址赋为NULL,而不能通过地址再次操作内存数据。
热心网友 时间:2022-04-14 20:41
您好,楼上说的不准确,也不是很完整。热心网友 时间:2022-04-14 22:49
里面的数据可能存在,只要该内存没有被别的地方占用。你free释放的是内存的使用权。热心网友 时间:2022-04-15 01:14
释放了,就没有了。再引用可能就会出问题