如何清理C中分配的内存?

Ton*_*yGW 5 c memory malloc

我编写了以下玩具程序,并观察到第二个变量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

Ded*_*tor 3

如果您的数据如此敏感,请使用平台调用来固定内存,并使用对某些memset变体的不可消除调用在释放之前进行清除。

当您将内存返还给运行时时,它可以自由地用于下一个拟合请求。标准并未强制要求是否以及何时这样做,或者是否将内存返还给可能的操作系统。

Aside:void free(void*) {}free.