根据here的内容,new在免费存储区中分配,而malloc使用堆,这两个术语通常表示同一件事。

根据here的写入内容,realloc可以将内存块移至新位置。如果免费存储和堆是两个不同的内存空间,那么这意味着什么问题吗?

我特别想知道它是否可以安全使用

int* data = new int[3];
// ...
int* mydata = (int*)realloc(data,6*sizeof(int));

如果没有,还有其他方法可以安全地用realloc分配new内存吗?我可以分配新区域并用memcpy内容,但是据我了解,如果可能,realloc可能会使用相同的区域。

最佳答案

您只能通过realloc(或家族,例如malloc)分配的calloc

这是因为跟踪可用空间和已用内存区域的基础数据结构可能会大不相同。

可能但绝不能保证C++ new和C malloc使用相同的基础分配器,在这种情况下realloc可以同时适用于两者。但正式地是在UB-land。在实践中,这只是不必要的风险。

C++不提供与realloc相对应的功能。

最接近的是容器的自动重新分配(内部缓冲区),例如std::vector

C++容器的设计方式无法使用realloc

代替显示的代码

int* data = new int[3];
//...
int* mydata = (int*)realloc(data,6*sizeof(int));

… 做这个:
vector<int> data( 3 );
//...
data.resize( 6 );

但是,如果您绝对需要realloc的一般效率,并且如果您必须接受new进行原始分配,那么效率的唯一途径就是使用特定于编译器的方式,因为realloc对于此编译器是安全的。

否则,如果您绝对需要realloc的一般效率但不被迫接受new,则可以使用mallocrealloc。这样,使用智能指针可以使您获得与C++容器相同的安全性。

关于c++ - 重新分配用new分配的内存是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33706528/

10-13 08:22