问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间: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()
{
    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,而不能通过地址再次操作内存数据。

热心网友 时间:2022-04-14 20:41

您好,楼上说的不准确,也不是很完整。
关于用malloc分配的内存,在调用free释放后,该内存的状态,有以下几点说明:
1.调用free释放掉所分配的内存后,表明该内存可以被别人使用,也就是说,其他地方调用malloc后,可以分配到该内存
2.关于free释放该内存后,该内存中的数据,我们只能认为是脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者被修改为其他值;
由此可见,有很多中可能情况,所以,在释放了该内存后,除了要对当时分配的指针赋值为NULL,还要注意不要再去引用这部分内存,不要尝试获取这部分的值,这些已经非法。

热心网友 时间:2022-04-14 22:49

里面的数据可能存在,只要该内存没有被别的地方占用。你free释放的是内存的使用权。

热心网友 时间:2022-04-15 01:14

释放了,就没有了。再引用可能就会出问题
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么时间试排卵纸最佳 排卵第十天排卵试纸弱阳怎么回事 手机app下载课后帮 课后帮点击了家长怎么改成学生的 课后帮绑定学生后还能绑定家长吗 课后帮怎么注册 课后帮注册教程 癫痫急救的正确方法 癫痫持续状态的抢救要点 小儿癫痫发作的急救措施 癫痫病急救常识有哪些要点 看C语言的书中说“释放存储空间”,是什么意思?什么叫做释放,为什么叫... C语言内存释放问题 求解关于C语言的释放内存问题? C语言中是如何释放内存单元的;原理又是什么? 微信如何图片加表情 如何查看手机上已连接的wifi密码? 初中800字半命题作文《站在……》在线等 站在校园的门口 作文 初三的作文帮帮忙 要800字的 作文特殊的站立700字 《站起来,勇往直前》800字作文谁能帮我 给篇800字 题目为 站起来做人 的作文。高2 努比亚z9max精英版怎么查看wifi密码 什么的站立。作文600字 查下农历1997年11月23日的公历是几月几日 求以“站立”为文题,800字作文! 手机root不了,如何能查看wifi密码?,重点是没root权限,努比亚手机,万能的网友,帮帮我吧 以'那一次,我站起来了'为题的初中作文.(700字左右) 努比亚 z9 mini精英版连接过的wifi密码怎么查看? 以“站立是最美丽的风景”为题的800字议论作文 农历十一月二十三也是冬至有那些年份 c语言释放内存的问题 C语言 调用函数完后释放内存吗? C语言中如何释放已定义的数组空间? 在C语言进行编程中,为什么要释放旧内存? 内存释放的时候具体进行了什么操作(C语言) C语言 内存释放的问题 华为荣耀V10连续点击三下缩放屏幕功能怎么弄 设置里没有高级模式 C语言用完申请来的内存怎么释放 C语言中再次释放已经释放的空间会造成什么后果? 华为荣耀10青春版,连续点几下屏幕,图标就会变大,不知怎么办? C语言中怎样清空内存动态分配的堆空间 在C语言中,如何释放动态数组里面某一个元素所在的内存? c语言分配内存方式有哪些 开发一个聊天交友软件,需要哪些费用?开发软件大概多少钱?需要服务器一年多少钱?还有其他什么费用? 华为荣耀10如何使用 网络视频会议软件,怎么收费呢,用过的人来说说,谢谢啊 好视通视频会议软件是免费的还是收费的?如果收费是怎样收的? 视频会议软件一般多少钱? 视频聊天软件开发需要多少钱 怎样取消WORD中数字与文字之间的距离(自动调节)