当以这种方式分配时,是否可以重新生成operator new()
分配的内存:
char* buf = new char[60];
C++ FAQ表示由new
分配的内存无法通过realloc调整大小,那么重新生成由new
分配的内存的正确方法是什么?
答案 0 :(得分:6)
正确的方法是不要这样做。
如果先前的分配不够大,只需分配新内存。
或者使用std::vector
非常有效地包装所有这些功能。
答案 1 :(得分:5)
正确的方法是使用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()
可能没有做得更好。
答案 2 :(得分:1)
答案 3 :(得分:1)
唯一的方法是做第二个新内容,复制内容然后删除旧的内存块:
char *tmpbuff = new char[70];
memcpy(tmpbuff, buff, 60 * sizeof(char));
delete [] buff;
buff = tmpbuff;
(不...... C ++不等于STL,所以有没有STL的生活:-))