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

问题描述 投票:0回答:1

假设代码如下:

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

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

所有这一切都与程序员不知道指定指针的内存(堆或堆栈)的上下文有关(在这一点上,程序的设计受到质疑,但我不会离题)。


Query

这是一种安全的方法来确保内存被正确释放,还是不正确并在内存中创建垃圾对象?

c++ memory-management
1个回答
13
投票

你不能realloc堆栈内存 - 所以你仍然有未定义的行为。

realloc(3)手册页会告诉你:

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

© www.soinside.com 2019 - 2024. All rights reserved.