首页 > 解决方案 > 在释放内存之前总是重新分配内存是否安全 - C++

问题描述

假设代码如下:

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

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

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


询问

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

标签: c++memory-management

解决方案


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

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

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


推荐阅读