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

如题所述

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

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

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

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

扩展资料:

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

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

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

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

如果要是不在用这部分内存的话,那不就等于内存泄露了吗?释放和不释放这部分内存有什么区别呢?

追答

释放了,不管后面用不用,都不算是泄漏;
如果没释放,却把之前分配空间时候得到的指针给赋值为NULL了,就是泄漏了;
释放了,别人就可以用,但是不一定非要用;不释放,别人一定用不了;

追问

如果释放了为什么不能去引用这部分内存呢?如果引用了会怎么样呢?

追答

上面已经说的很清楚了。
如果释放了,那么这部分的值有几种可能
1,还是原来的值
2,被清空为0,取决于平台和编译器的处理
3,被别人分配去了,已经修改了值

这里所说的:不能去引用,并不是说真的不允许,而是说:我们不应该去引用
如果引用了会如何:那不一定,看编译器的心情了

我给你举个实际的例子吧,比如说,老人告诉你,山里有蛇,不要上山。
这并不是说你上山了,就一定被蛇咬到,而是告诉你,有这种可能。至于你是否非要上,就看你了。

追问

谢谢您,您说的这些我差不多明白了,但是还有一点有点迷糊,就是引用了这段内存的话,里边的值被修改了,那申请的这段内存所操作的数据就可能变了,对这段内存多所做的程序不就白做了吗?

追答

我不太明白你说的引用了这段内存,是指释放前还是释放后。
如果说是在释放前,
A1、理论上只有分配的人才有这片内存的指针,才能进行修改这部分的值;如果确实是由分配的人修改的值,那就不算是白做了,因为他具有修改的权限;
A2、如果是被别人修改了,那确实会出问题,属于别人越界处理;
如果实在释放后,
B1、如果没有人再次分配了这片内存,那至于值再被改动,那是不影响的,因为没人要用它
B2、如果有人分配而且改动了值,那就符合上面的A1的情况,属于正常

如果全部理解了,强烈建议你给我加分,打了几百字了,呵呵

本回答被提问者采纳
第2个回答  2012-04-17
里面的数据可能存在,只要该内存没有被别的地方占用。你free释放的是内存的使用权。
第3个回答  2022-01-16

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

    比如有一个 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 申请一块内存。

第4个回答  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,而不能通过地址再次操作内存数据。

相似回答