关于使用分配的内存,调用free后的内存状态解释如下:
1.当调用free来释放分配的内存时,它表明该内存可以被其他人使用,也就是说,它可以在其他地方调用malloc之后分配给内存
2.对于释放后内存中的数据数量,我们只能认为是脏数据;换句话说,这部分数据可能存在并保持原始值,也可能被清空或修改为其他值;
这表明有许多可能的情况下,因此,内存被释放后,除了分配指针赋值的空,也要小心不要参考这部分的内存,不要试图得到这部分的价值,这些已经是非法的。
扩展资料:
在程序中使用自由释放,否则内存将不会被释放。
C将不会被释放。所谓的动态内存是malloc系列函数所请求的内存,只有在程序中使用free时才会释放。
标准库中malloc函数的实现原理。要理解malloc的内存存储结构,与全局变量不同,malloc不在编译器编译时分配内存空间,而只在调用malloc函数时才分配内存空间。有时我在中间调用free函数来释放空间。
如果要是不在用这部分内存的话,那不就等于内存泄露了吗?释放和不释放这部分内存有什么区别呢?
追答释放了,不管后面用不用,都不算是泄漏;
如果没释放,却把之前分配空间时候得到的指针给赋值为NULL了,就是泄漏了;
释放了,别人就可以用,但是不一定非要用;不释放,别人一定用不了;
如果释放了为什么不能去引用这部分内存呢?如果引用了会怎么样呢?
追答上面已经说的很清楚了。
如果释放了,那么这部分的值有几种可能
1,还是原来的值
2,被清空为0,取决于平台和编译器的处理
3,被别人分配去了,已经修改了值
这里所说的:不能去引用,并不是说真的不允许,而是说:我们不应该去引用
如果引用了会如何:那不一定,看编译器的心情了
我给你举个实际的例子吧,比如说,老人告诉你,山里有蛇,不要上山。
这并不是说你上山了,就一定被蛇咬到,而是告诉你,有这种可能。至于你是否非要上,就看你了。
谢谢您,您说的这些我差不多明白了,但是还有一点有点迷糊,就是引用了这段内存的话,里边的值被修改了,那申请的这段内存所操作的数据就可能变了,对这段内存多所做的程序不就白做了吗?
追答我不太明白你说的引用了这段内存,是指释放前还是释放后。
如果说是在释放前,
A1、理论上只有分配的人才有这片内存的指针,才能进行修改这部分的值;如果确实是由分配的人修改的值,那就不算是白做了,因为他具有修改的权限;
A2、如果是被别人修改了,那确实会出问题,属于别人越界处理;
如果实在释放后,
B1、如果没有人再次分配了这片内存,那至于值再被改动,那是不影响的,因为没人要用它
B2、如果有人分配而且改动了值,那就符合上面的A1的情况,属于正常
如果全部理解了,强烈建议你给我加分,打了几百字了,呵呵
楼上已经回答很好了,我就简单总结一下:
比如有一个 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 申请一块内存。
前面已经有大神回答了,我这里刚好有个例子来说明一下。
我用VS2015写了一段释放链表所有节点的代码,下面看正确的部分
VOID DestoryList()然后,下面是错误的代码:
VOID DestoryList()注意到了没?我在free(pstCurNode)之后,继续pstCurNode这个变量,但是只要一使用,程序就会崩溃,经过调试后发现,pstCurNode->pstNext这个指针,在free前后值会发生变化,这就很明显了,所以我就用一个临时变量记录原始的指针值,并在最后才free此空间。
换句话说,一旦free某块内存后,你最多只能将指向这块内存的地址赋为NULL,而不能通过地址再次操作内存数据。