在释放内存之前总是重新分配内存是否安全-C ++

时间:2019-03-19 21:45:56

标签: c++ memory-management

假设这样的代码:

#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;
}

我的假设是,这会将指针发送到堆内存,以便可以适当地释放它。

所有这些都是在程序员不知道在哪个内存(堆或堆栈)上指定了指针的情况下进行的(此时,程序的设计存在疑问,但我不会提出疑问)


查询

这是确保内存正确释放的安全方法吗? 是不正确的,并且会在内存中创建垃圾对象吗?

1 个答案:

答案 0 :(得分:13)

您无法realloc堆叠内存-因此您仍具有未定义的行为。

realloc(3)手册页将告诉您以下内容:

  

重新分配给定的内存区域。必须事先分配   由malloc(),calloc()或realloc()调用,尚未通过调用释放   释放或重新分配。否则,结果是不确定的。