当遇到0时,free()是如何释放内存的?

问题描述 投票:0回答:1

我有一个关于C函数free()的问题。如果我先为char-string分配内存,然后将'/0'移到字符串的任何位置,并将新指针设置到'/0'之后的下一个位置,会发生什么?如果我在初始指针上使用free,会不会有内存泄漏?还是编译器知道终止位置,然后释放所有分配的内存?手册上说 "释放由malloc分配的指针",但我仍然没有完全理解这个过程。

有一个例子。

#include "stdlib.h"
int main()
{
    int i = 0;
    char* test = (char*)malloc(sizeof(char) * 100);
    char s = 'a';
    for (int i = 0; i < 10; i++)
        test[i] = s;
    test[10] = '\0';
    char* v = (test + 6);
    test[4] = 0;
    free(test);
    return 0;
 }

Valgrind说:

地址0x522d048是8个字节,在一个大小为100的区块中被释放了

c gcc memory-leaks valgrind free
1个回答
1
投票

malloc 保留内存供你使用并返回一个指向该内存的指针。在内部。malloc 会记住有关该存储器的信息。特别是,它记得它保留了多少。

当同一个指针被传递给 free, free 终止该保留。

一旦该保留结束,你就不应该使用任何该内存。在您的例子中,当您调用 free(test), 保留的内存的 malloc(sizeof(char) * 100) 被释放。事实上,你在其中一部分放了一个空字符,之后还有数据,这是不相关的。事实上,你仍然有一个指针。v 指向内存中的某个地方是无关紧要的。free 释放所有被分配的内存,无论内容如何。

(这并不意味着尝试使用内存将不会成功。当你调用 free記憶體不再保留給你使用。但是有可能没有任何东西会阻止你使用它--如果你尝试的话,不保证会发生陷阱。但也有可能发生陷阱,或者你的程序中的其他软件可能会使用该内存,因此你对它的使用可能会受到干扰。)


1
投票

内存分配与 malloc 分配请求的字节数,并返回一个指向分配范围起始的指针。free() 重新分配的范围 只是 返回的指针时,通过 malloc. 任何其他指针传递给 free 调用 "未定义行为"。

两个函数都不知道或关心你在分配的字节范围内放置什么信息。

此外,释放一个NULL指针没有任何作用,因为根据标准的NULL值是内部检查的。

© www.soinside.com 2019 - 2024. All rights reserved.