函数返回的 Malloc 内存未被释放
Malloc'ed memory returned by function is not being freed
下面我使用函数 input 来收集和 return 一个字符串到函数 main。
我将 returned pointer/string 存储在一个 char* 中,并在使用后使用该变量释放 malloced 内存。
但是,在我的 free 调用之后,分配的内存似乎仍然可用。
char* input();
const int MAX = 100;
int main() {
while(1) {
char * input_function_pointer = input();
printf("%p", &input_function_pointer);
puts(input_function_pointer);
free(input_function_pointer);
puts("_______");
printf("%p", &input_function_pointer);
puts(input_function_pointer);
puts("_______");
}
return 0;
}
char* input() {
char * str = malloc(MAX);
printf( "Enter a value :");
fgets( str, MAX, stdin );
return str;
}
无法保证如果您在 free
访问一块内存后尝试访问它会发生什么。这是未定义的行为,在这种情况下恰好适用于您的特定编译器。
释放内存不会强制擦除其内容(取决于编译器选项,主要是启用了调试)并且没有什么可以阻止您访问该内容 space。您处于未定义行为中,正在访问所谓的“悬挂指针”:您可能会在释放它后立即看到相同的内容,可能不会在其他 malloc 被调用后看到...或崩溃。
释放内存只是将 space 标记为可用于分配,不会阻止进一步的读(或写)访问。这(也是)为什么 C 被认为是“低级别”的原因。
7.22.3.3 自由函数c11
The free function causes the space pointed to by ptr to be
deallocated, that is, made available for further allocation
取消引用 dangling pointer 调用未定义的行为。
free
不修改释放内存的内容。它也不会改变指针。
包含对已释放内存的引用的指针称为 dangling pointer
并且取消引用它(就像您在程序中所做的那样)是未定义的行为
下面我使用函数 input 来收集和 return 一个字符串到函数 main。 我将 returned pointer/string 存储在一个 char* 中,并在使用后使用该变量释放 malloced 内存。
但是,在我的 free 调用之后,分配的内存似乎仍然可用。
char* input();
const int MAX = 100;
int main() {
while(1) {
char * input_function_pointer = input();
printf("%p", &input_function_pointer);
puts(input_function_pointer);
free(input_function_pointer);
puts("_______");
printf("%p", &input_function_pointer);
puts(input_function_pointer);
puts("_______");
}
return 0;
}
char* input() {
char * str = malloc(MAX);
printf( "Enter a value :");
fgets( str, MAX, stdin );
return str;
}
无法保证如果您在 free
访问一块内存后尝试访问它会发生什么。这是未定义的行为,在这种情况下恰好适用于您的特定编译器。
释放内存不会强制擦除其内容(取决于编译器选项,主要是启用了调试)并且没有什么可以阻止您访问该内容 space。您处于未定义行为中,正在访问所谓的“悬挂指针”:您可能会在释放它后立即看到相同的内容,可能不会在其他 malloc 被调用后看到...或崩溃。
释放内存只是将 space 标记为可用于分配,不会阻止进一步的读(或写)访问。这(也是)为什么 C 被认为是“低级别”的原因。
7.22.3.3 自由函数c11
The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation
取消引用 dangling pointer 调用未定义的行为。
free
不修改释放内存的内容。它也不会改变指针。
包含对已释放内存的引用的指针称为 dangling pointer
并且取消引用它(就像您在程序中所做的那样)是未定义的行为