假设代码如下:
#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;
}
我的假设是,它将指针发送到堆内存,以便可以适当地释放它。
所有这一切都与程序员不知道指定指针的内存(堆或堆栈)的上下文有关(在这一点上,程序的设计受到质疑,但我不会离题)。
这是一种安全的方法来确保内存被正确释放,还是不正确并在内存中创建垃圾对象?
你不能realloc
堆栈内存 - 所以你仍然有未定义的行为。
realloc(3)手册页会告诉你:
重新分配给定的内存区域。它必须先由malloc(),calloc()或realloc()分配,但尚未通过调用free或realloc释放。否则,结果是不确定的。