由运营商new()分配的重新存储内存?

时间:2011-01-19 15:38:23

标签: c++

当以这种方式分配时,是否可以重新生成operator new()分配的内存:

char* buf = new char[60];

C++ FAQ表示由new分配的内存无法通过realloc调整大小,那么重新生成由new分配的内存的正确方法是什么?

4 个答案:

答案 0 :(得分:6)

正确的方法是不要这样做。

如果先前的分配不够大,只需分配新内存。

或者使用std::vector非常有效地包装所有这些功能。

答案 1 :(得分:5)

正确的方法是使用std::vectorstd::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的生活:-))