C++:动态分配数组的正确调整大小方法是什么?

5

在C语言中,我会使用 realloc 来完成这个任务。

在C++中,通常会考虑使用STL的 vector 类。

但如果不使用以上解决方案,如何正确地调整C++数组的大小呢?


2
在C++中调整动态分配数组的正确方法是使用向量(vector)。请告诉我们您对向量(vector)(和realloc)的反对意见,以便我们在回答中予以尊重。 - Peter G.
4个回答

8

在C++中没有realloc的好等价物。您需要手动复制数组并将旧元素复制过去。幸运的是,由于<algorithm>中的std::copy函数,这并不太难:

size_t k =  /* ... */
T* buffer = /* .. get old buffer of size k. .. */

T* newBuffer = new T[newSize];  // Assume newSize >= k
std::copy(buffer, buffer + k, newBuffer);

delete [] buffer;
buffer = newBuffer;

希望这能帮到你!
编辑:调整了最后两行的顺序!糟糕!

@Nawaz- 哎呀!我真是太傻了。我刚刚更新了代码,所以它不再这样做了。 - templatetypedef
-1 不正确的语句:“在C++中没有realloc的很好的等价物。” C++包含(大部分)C标准库,其中包括realloc函数。 - Cheers and hth. - Alf
3
@Alf P. Steinbach- 这是真的,但是 realloc 只适用于 POD 类型。如果您尝试对 stringvector 等数组进行 realloc,结果将是未定义的。我可能应该说没有好的通用替代方案可以取代 realloc - templatetypedef

3
通过执行vector和realloc内部所做的操作:创建一个新的、更大的数组,复制旧数组的内容,并销毁旧数组。

0
int* arr = new int[20];
...
//wanna resize to 25?
int* temp = new int[25];
std::copy(arr, arr+20, temp);
delete [] arr;
arr = temp;
... //now arr has 25 elements

但是,当然,你不应该这样做 :)


0

如果你坚持要在C++中自己完成这个任务,你可能想要像std::vector一样粗略地分配原始内存,使用全局new运算符,然后使用放置new在原地创建对象。

否则,你最终会在你分配的所有内存中构造对象,然后在使用它们时对它们进行赋值。除非你知道初始(默认)对象构造是轻量级的,否则你最好尽可能避免它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接