c语言中free函数释放内存后,该内存的里边的数据还有吗?
关于使用分配的内存,调用free后的内存状态解释如下:
1.当调用free来释放分配的内存时,它表明该内存可以被其他人使用,也就是说,它可以在其他地方调用malloc之后分配给内存
2.对于释放后内存中的数据数量,我们只能认为是脏数据;换句话说,这部分数据可能存在并保持原始值,也可能被清空或修改为其他值;
这表明有许多可能的情况下,因此,内存被释放后,除了分配指针赋值的空,也要小心不要参考这部分的内存,不要试图得到这部分的价值,这些已经是非法的。
扩展资料:
在程序中使用自由释放,否则内存将不会被释放。
C将不会被释放。所谓的动态内存是malloc系列函数所请求的内存,只有在程序中使用free时才会释放。
标准库中malloc函数的实现原理。要理解malloc的内存存储结构,与全局变量不同,malloc不在编译器编译时分配内存空间,而只在调用malloc函数时才分配内存空间。有时我在中间调用free函数来释放空间。
关于用malloc分配的内存,在调用free释放后,该内存的状态,有以下几点说明:
1.调用free释放掉所分配的内存后,表明该内存可以被别人使用,也就是说,其他地方调用malloc后,可以分配到该内存
2.关于free释放该内存后,该内存中的数据,我们只能认为是脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者被修改为其他值;
由此可见,有很多中可能情况,所以,在释放了该内存后,除了要对当时分配的指针赋值为NULL,还要注意不要再去引用这部分内存,不要尝试获取这部分的值,这些已经非法。
如果要是不在用这部分内存的话,那不就等于内存泄露了吗?释放和不释放这部分内存有什么区别呢?
释放了,不管后面用不用,都不算是泄漏;
如果没释放,却把之前分配空间时候得到的指针给赋值为NULL了,就是泄漏了;
释放了,别人就可以用,但是不一定非要用;不释放,别人一定用不了;
楼上已经回答很好了,我就简单总结一下:
比如有一个 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 申请一块内存。
2019-10-06
前面已经有大神回答了,我这里刚好有个例子来说明一下。
我用VS2015写了一段释放链表所有节点的代码,下面看正确的部分
VOID DestoryList()
{
SINGLE_LIST_S *pstList = GetList();
if (NULL == pstList)
{
return;
}
NODE_S *pstCurNode = NULL;
pstCurNode = pstList->pstHead;
NODE_S *pstTmpNode = NULL;
while (NULL != pstCurNode)
{
LIST_NODE_DATA_S stInfo = pstCurNode->stData;
pstTmpNode = pstCurNode;
pstCurNode = pstCurNode->pstNext;
free(pstTmpNode);
pstTmpNode = NULL;
}
return;
}
然后,下面是错误的代码:
VOID DestoryList()
{
SINGLE_LIST_S *pstList = GetList();
if (NULL == pstList)
{
return;
}
NODE_S *pstCurNode = NULL;
pstCurNode = pstList->pstHead;
while (NULL != pstCurNode)
{
// 注意此三行
LIST_NODE_DATA_S stInfo = pstCurNode->stData;
free(pstCurNode);
pstCurNode = pstCurNode->pstNext;
}
return;
}
注意到了没?我在free(pstCurNode)之后,继续pstCurNode这个变量,但是只要一使用,程序就会崩溃,经过调试后发现,pstCurNode->pstNext这个指针,在free前后值会发生变化,这就很明显了,所以我就用一个临时变量记录原始的指针值,并在最后才free此空间。
换句话说,一旦free某块内存后,你最多只能将指向这块内存的地址赋为NULL,而不能通过地址再次操作内存数据。