我编写了以下玩具程序,并观察到第二个变量test2将采用第一个变量test1释放的内存地址。即使我释放(test1),test2 也会保留 test1 的字段值。我想知道如何清理C中free()留下的数据:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct test_str
{
char name[128];
int Id;
} test_str;
typedef test_str* mytest;
int main()
{
mytest test1 = malloc(sizeof(test_str));
printf("test1 pointer address is %p \n", test1);
strcpy(test1->name, "hello world");
test1->Id = 10;
free(test1);
// test1->name = NULL; /* this does not work */
// test1->Id = 0; /* without resetting Id = 0, test2->Id will show 10 */
test1 = NULL;
mytest test2 = malloc(sizeof(test_str));
printf("test2 pointer address is %p, name field is %s, Id = %d \n", test2, test2->name, test2->Id);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
test1 指针地址为 0x2401010
test2 指针地址为 0x2401010,name 字段为 hello world,Id = 10
如果您的数据如此敏感,请使用平台调用来固定内存,并使用对某些memset变体的不可消除调用在释放之前进行清除。
当您将内存返还给运行时时,它可以自由地用于下一个拟合请求。标准并未强制要求是否以及何时这样做,或者是否将内存返还给可能的操作系统。
Aside:void free(void*) {}是free.