遇到0时free()如何释放内存?
How does free () frees memory when 0 is encountered?
我有一个关于 C 函数 free() 的问题。
如果我首先为 char-string 分配内存,然后将 '\0' 传递到字符串的任何位置并将新指针设置为 '\0' 位置之后的下一个位置,将会发生什么情况?
如果在我尝试在初始指针上使用 free 之后,是否存在内存泄漏?或者编译器知道终止位置并释放所有分配的内存?
手册上说"Frees the pointer, allocated by 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] = '[=10=]';
char* v = (test + 6);
test[4] = 0;
free(test);
return 0;
}
Valgrind 说:
Address 0x522d048 is 8 bytes inside a block of size 100 free'd
使用 malloc
的内存分配分配请求的字节数和 returns 指向分配范围开头的指针。
当您传递由 malloc
返回的指针时,函数 free()
仅释放范围 。任何其他传递给 free
的指针都会调用 "undefined behavior".
两个函数都不知道或不关心您在分配的字节范围内放置了什么信息。
此外,释放 NULL 指针没有任何作用,因为根据标准值 NULL 是内部检查的。
malloc
保留供您使用的内存和 returns 指向该内存的指针。在内部,malloc
会记住有关该内存的信息。特别是,它会记住保留了多少。
当相同的指针传递给 free
时,free
终止保留。
一旦该保留结束,您就不应再使用该内存。在您的示例中,当您调用 free(test)
时,由 malloc(sizeof(char) * 100)
保留的 all 内存被释放。您在其中的一部分中放置了一个空字符并在之后拥有数据这一事实是无关紧要的。您仍然有一个指向内存中某处的指针 v
这一事实是无关紧要的。 free
释放所有分配的内存,无论内容如何。
(这并不意味着尝试使用内存将不起作用。在您调用free
后,内存不再保留供您使用。但有可能什么都不会阻止你不要使用它——如果你尝试的话,保证不会发生陷阱。但也有可能发生陷阱,或者你程序中的其他软件可能会使用该内存,因此你对它的使用可能会受到干扰。)
我有一个关于 C 函数 free() 的问题。 如果我首先为 char-string 分配内存,然后将 '\0' 传递到字符串的任何位置并将新指针设置为 '\0' 位置之后的下一个位置,将会发生什么情况? 如果在我尝试在初始指针上使用 free 之后,是否存在内存泄漏?或者编译器知道终止位置并释放所有分配的内存? 手册上说"Frees the pointer, allocated by 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] = '[=10=]';
char* v = (test + 6);
test[4] = 0;
free(test);
return 0;
}
Valgrind 说:
Address 0x522d048 is 8 bytes inside a block of size 100 free'd
使用 malloc
的内存分配分配请求的字节数和 returns 指向分配范围开头的指针。
当您传递由 malloc
返回的指针时,函数 free()
仅释放范围 。任何其他传递给 free
的指针都会调用 "undefined behavior".
两个函数都不知道或不关心您在分配的字节范围内放置了什么信息。
此外,释放 NULL 指针没有任何作用,因为根据标准值 NULL 是内部检查的。
malloc
保留供您使用的内存和 returns 指向该内存的指针。在内部,malloc
会记住有关该内存的信息。特别是,它会记住保留了多少。
当相同的指针传递给 free
时,free
终止保留。
一旦该保留结束,您就不应再使用该内存。在您的示例中,当您调用 free(test)
时,由 malloc(sizeof(char) * 100)
保留的 all 内存被释放。您在其中的一部分中放置了一个空字符并在之后拥有数据这一事实是无关紧要的。您仍然有一个指向内存中某处的指针 v
这一事实是无关紧要的。 free
释放所有分配的内存,无论内容如何。
(这并不意味着尝试使用内存将不起作用。在您调用free
后,内存不再保留供您使用。但有可能什么都不会阻止你不要使用它——如果你尝试的话,保证不会发生陷阱。但也有可能发生陷阱,或者你程序中的其他软件可能会使用该内存,因此你对它的使用可能会受到干扰。)