c语言中free函数释放内存后,该内存的里边的数据还有吗?

 我来答
大宝妈谈教育
高粉答主

2020-05-13 · 关注我不会让你失望
知道小有建树答主
回答量:3306
采纳率:100%
帮助的人:54.6万
展开全部

关于使用分配的内存,调用free后的内存状态解释如下:

1.当调用free来释放分配的内存时,它表明该内存可以被其他人使用,也就是说,它可以在其他地方调用malloc之后分配给内存

2.对于释放后内存中的数据数量,我们只能认为是脏数据;换句话说,这部分数据可能存在并保持原始值,也可能被清空或修改为其他值;

这表明有许多可能的情况下,因此,内存被释放后,除了分配指针赋值的空,也要小心不要参考这部分的内存,不要试图得到这部分的价值,这些已经是非法的。

扩展资料:

在程序中使用自由释放,否则内存将不会被释放。

C将不会被释放。所谓的动态内存是malloc系列函数所请求的内存,只有在程序中使用free时才会释放。

标准库中malloc函数的实现原理。要理解malloc的内存存储结构,与全局变量不同,malloc不在编译器编译时分配内存空间,而只在调用malloc函数时才分配内存空间。有时我在中间调用free函数来释放空间。

滴冰的水
推荐于2017-11-25 · TA获得超过1040个赞
知道小有建树答主
回答量:250
采纳率:0%
帮助的人:327万
展开全部
您好,楼上说的不准确,也不是很完整。
关于用malloc分配的内存,在调用free释放后,该内存的状态,有以下几点说明:
1.调用free释放掉所分配的内存后,表明该内存可以被别人使用,也就是说,其他地方调用malloc后,可以分配到该内存
2.关于free释放该内存后,该内存中的数据,我们只能认为是脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者被修改为其他值;
由此可见,有很多中可能情况,所以,在释放了该内存后,除了要对当时分配的指针赋值为NULL,还要注意不要再去引用这部分内存,不要尝试获取这部分的值,这些已经非法。
更多追问追答
追问
如果要是不在用这部分内存的话,那不就等于内存泄露了吗?释放和不释放这部分内存有什么区别呢?
追答
释放了,不管后面用不用,都不算是泄漏;
如果没释放,却把之前分配空间时候得到的指针给赋值为NULL了,就是泄漏了;
释放了,别人就可以用,但是不一定非要用;不释放,别人一定用不了;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
白痴二马
2012-04-17
知道答主
回答量:6
采纳率:0%
帮助的人:9711
展开全部
里面的数据可能存在,只要该内存没有被别的地方占用。你free释放的是内存的使用权。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小可爱A2A
2022-01-16
知道答主
回答量:3
采纳率:0%
帮助的人:1131
展开全部

楼上已经回答很好了,我就简单总结一下:

  1. 比如有一个 int* p 的指针,申请内存: p = (int*)malloc(sizeof(int));

    你就可以对“p”做这样的操作:*p = 54;

  2. 使用 free(p); 那么就是切断了 p 对所分配内存的使用权,也就是说其他人是可以使用这块内存的。但是 p 保存的地址仍然存在,你再 *p = 55; 这样操作,必定会造成非法访问,因为 p 失去了对保存的地址的使用权。

  3. 如果没有 free(p); ,那么指针 p 所申请的内存,将不会被其他人使用。

    当你做了 p = NULL; 这个操作,只是你所写的整个代码程序占用了这块由 指针 p 所申请的内存,导致了你不再使用这块内存,别人也无法使用这块内存,造成内存泄漏。

  4. 使用 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,而不能通过地址再次操作内存数据。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式