当使用operator new()
方式分配内存时,是否有可能重新分配该内存?
char* buf = new char[60];
C++ FAQ指出,new
分配的内存不能通过realloc调整大小,那么如何正确地重新分配由new
分配的内存?
正确的做法是不要这样做。
如果之前的分配不够大,只需分配新的内存。
或者使用 std::vector
,它可以非常高效地包装所有这些功能。
正确的方法是根据数组的特定用途使用 std::vector
或 std::string
--让 C++ 为您处理分配。
如果你必须使用 new
,那么你需要重新分配内存并复制数据。这个简单的模板函数可以帮助你完成这些基本操作:
template <typename T>
T *GrowArray(T *oldArray, size_t oldCount, size_t newCount) {
T *newArray = new T[newCount];
if (oldArray) {
std::copy(oldArray, oldArray + std::min(oldCount, newCount), newArray);
delete[] oldArray;
}
return newArray;
}
realloc()
所做的事情,只不过没有类型安全性。如果这看起来效率低下,那么 realloc()
可能并没有做得更好。realloc
的评论并不正确。虽然realloc
可能执行与您发布的函数类似的操作,但它同样有可能使用特定于操作系统的知识,在不复制数组内容的情况下“扩展”数组。例如,在某些Linux版本中,由malloc
返回的内存块是以程序员无法访问但内部实现可以访问的大小变量开头的。当调用realloc
时,实现可以检查此变量以查看是否可以扩展数组而不必复制所有内容。 - Charles Salviarealloc
之后,原始指针也不再有效。 - Jonathan Grynspanchar *tmpbuff = new char[70];
memcpy(tmpbuff, buff, 60 * sizeof(char));
delete [] buff;
buff = tmpbuff;
(不...C++并不等同于STL,所以没有STL的生活也是可以的 :-))
new
/delete
系统默认情况下没有类似于realloc
的操作。如果您需要使用new
,那么您可能真正需要的是一个std::vector
。重复问题链接:http://stackoverflow.com/questions/1179669/realloc-function-that-would-work-for-memory-allocated-using-new-instead-of-reallo - wkl