所以,我知道我们不应该尝试访问释放的内存。 例如
int * x = calloc(10, sizeof(int));
free(x);
x[0] = 2; // results in data corruption
像 LINK 这样的大多数帖子都说不要重复使用指针句号。调用 free() 后,我可以在同一个指针上再次调用 malloc()(或 calloc())吗?我的理解是,它现在将指向一个新的、未使用的内存部分并且没问题。 例如
int * x = calloc(10, sizeof(int));
free(x);
x = calloc(10, sizeof(int));
x[0] = 2;
如果指针以前的内存位置现在被其他变量使用怎么办?例如
int * x = calloc(10, sizeof(int));
free(x);
... stuff happens here ...
x = calloc(10, sizeof(int));
x[0] = 2;
指针只存储
malloc
返回的值,这个函数对这个指针一无所知
如果您
malloc
以前存储的值,您可以根据需要使用free
函数返回的值多次分配指针,否则会发生内存泄漏。
void foo(void)
{
char *ptr;
for(size_t i = 0; i < 10000000; i++)
{
ptr = malloc(rand() % 1000000);
free(ptr);
}
}
对先前释放的
x
指针变量的另一个 malloc 调用工作得很好。现在 x
可能指向 malloc 返回的不同地址。
但是,一些内存分配器会保留一个指向您最后一次分配的指针作为内部优化,因此它们可能会为您提供完全相同的地址以避免寻找新地址,这需要时间。
之前的内存不能被其他变量使用,因为malloc分配的是堆内存,而其他变量可以分配到一个固定的内存块,不一定是堆内存。
除非其他一些堆内存分配在别处保留该块,执行一些操作,然后释放它并且您碰巧再次重新分配,否则不会触及该内存,这不是您可以控制的。