C++ 重新增长运算符new()分配的内存?

C++ 重新增长运算符new()分配的内存?,c++,C++,当以这种方式分配时,是否可以重新分配操作员new()分配的内存: char* buf = new char[60]; 声明由new分配的内存不能由realloc调整大小,那么重新分配由new分配的内存的正确方法是什么?正确的方法是不这样做 如果以前的分配不够大,只需分配新内存即可 或使用 STD::向量>代码>非常有效地封装所有这些功能。 < P>正确的方法是使用 STD::vector < /COD>或 STD::String 根据您的特定用法使用数组,让C++为您分配。< / P> 如

当以这种方式分配时,是否可以重新分配
操作员new()
分配的内存:

char* buf = new char[60];

声明由
new
分配的内存不能由realloc调整大小,那么重新分配由
new
分配的内存的正确方法是什么?

正确的方法是不这样做

如果以前的分配不够大,只需分配新内存即可


<>或使用<代码> STD::向量>代码>非常有效地封装所有这些功能。

< P>正确的方法是使用<代码> STD::vector < /COD>或<代码> STD::String 根据您的特定用法使用数组,让C++为您分配。< / P> 如果必须使用
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;
}
模板
T*growtarray(T*oldArray,size\T oldCount,size\T newCount){
T*newArray=newt[newCount];
if(oldArray){
std::copy(oldArray,oldArray+std::min(oldCount,newCount),newArray);
删除[]旧数组;
}
返回新数组;
}

请注意,在大多数实现和大多数用例中,这基本上就是
realloc()
所做的,减去类型安全性。如果您觉得这样做效率很低,那么,
realloc()
可能没有做得更好。

唯一的方法是进行第二次新操作,复制内容,然后删除旧内存块:

char *tmpbuff = new char[70];
memcpy(tmpbuff, buff, 60 * sizeof(char));
delete [] buff;
buff = tmpbuff;

<>(不…C++是STL,所以没有STL:)——< /P> > C++ >代码> < <代码> >代码>删除> /Cuff>系统(默认情况下),没有类似的操作。如果需要使用
new
,您可能真的需要
std::vector
。复制的:基于没有一个.1表示代码正确(一目了然)的正确解决方案,但调用此方法
growtarray
有点误导。调用后原始指针不好。@John-任何适当的文档都无法处理。:)你对realloc的评论并不正确。虽然
realloc
可能会执行与您发布的函数类似的操作,但它同样可能使用操作系统特定的知识来“扩展”数组,而不复制数组的内容。例如,在某些Linux版本上,
malloc
返回的内存块前面有一个大小变量,程序员无法访问该变量,但内部实现可以访问该变量。调用
realloc
时,实现可以检查这个变量,看看是否可以扩展数组而不复制所有内容。@Charles:我知道--我在简化。对于大小少量增加/不跨越页面边界的调用,是的,操作系统将能够优化而不是重新分配。但是,对于较大的大小,我的注释仍然有效。@John:调用成功后,指向
realloc
的原始指针也不好。