假设这样的代码:
#include <stdlib.h>
int main(int argc, char* argv[]) {
int value = 42;
void* pointer = (void*) &value;
// Free stack memory
free(pointer);
return 0;
}
此代码导致未定义的行为,因为它尝试在堆栈上取消分配内存。
但是我想知道;每次释放指针之前,都要重新分配一个指针。
#include <stdlib.h>
int main(int argc, char* argv[]) {
int value = 42;
void* pointer = (void*) &value;
// Allocate pointer on heap, then free memory
pointer = realloc(pointer, sizeof pointer);
free(pointer);
return 0;
}
我的假设是,这会将指针发送到堆内存,以便可以适当地释放它。
所有这些都是在程序员不知道在哪个内存(堆或堆栈)上指定了指针的情况下进行的(此时,程序的设计存在疑问,但我不会提出疑问)
这是确保内存正确释放的安全方法吗? 是不正确的,并且会在内存中创建垃圾对象吗?
答案 0 :(得分:13)
您无法realloc
堆叠内存-因此您仍具有未定义的行为。
realloc(3)手册页将告诉您以下内容:
重新分配给定的内存区域。必须事先分配 由malloc(),calloc()或realloc()调用,尚未通过调用释放 释放或重新分配。否则,结果是不确定的。