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

C++ 在释放内存之前总是重新分配内存安全吗-C++;,c++,memory-management,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; } #包括 int main(int argc,char*argv[]){ 整数值=42; void*指针=(void

假设代码如下:

#include <stdlib.h>

int main(int argc, char* argv[]) {
    int value = 42;
    void* pointer = (void*) &value;

    // Free stack memory
    free(pointer);

    return 0;
}
#包括
int main(int argc,char*argv[]){
整数值=42;
void*指针=(void*)和值;
//空闲堆栈内存
自由(指针);
返回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;
}
#包括
int main(int argc,char*argv[]){
整数值=42;
void*指针=(void*)和值;
//在堆上分配指针,然后释放内存
指针=realloc(指针,指针大小);
自由(指针);
返回0;
}
我的假设是,这会将指针发送到堆内存,以便可以适当地释放它

所有这些都是在程序员不知道指针是在什么内存(堆或堆栈)上指定的情况下发生的(在这一点上,程序的设计有问题,但我不会离题)


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

您不能
realloc
堆栈内存-因此您仍然有未定义的行为

realloc(3)手册页将告诉您:

重新分配给定的内存区域。它必须事先分配 通过malloc()、calloc()或realloc(),但尚未通过调用释放 免费的或真实的。否则,结果是未定义的


std::free(指针)不是C代码。请检查您的标记或更改显示的代码。在C中,您只能
realloc()
malloc()
(或
calloc()
)获取的指针。。。或者另一个
realloc()
使用了
malloc()
中的指针。。。对于
free()
,也是如此。除了不重新分配堆栈内存的其他问题外,这不是调用realloc的安全方法。您需要将realloc'ed内存保存在一个temp变量中,并在继续之前检查它是否为NULL。是否释放某些内容取决于您是否是它的唯一所有者。如果您不知道这一点,那么尝试释放它的任何方法都是不安全的。您可以调用堆栈内存上的
delete
reallc
reallocate
的缩写,意思是“分配一个新的”,意思是在重新分配之前发生的先前分配的动态内存。