重新分配C++数组的内存。

3
可能是重复问题:
如何在C++中使用realloc() 我知道如果内存是通过malloc()calloc()分配的,可以使用realloc()扩展C++数组。我的问题是,如果内存是通过new运算符分配的,我该如何扩展C++数组呢?

malloc/realloc是C库调用 - 虽然它们可以在C++中使用,但通常应该避免使用,因为C++有更强大的处理动态数组等的方法。 - Paul R
3个回答

12

你不能这样做 - 这就是为什么在C++中你要使用std::vector<>

如果你想这样做,你必须先分配一个新的数组(通过new),然后拷贝旧的元素到新的数组中(例如使用std::copy),最后删除之前的数组。std::vector可以替你完成所有这些步骤...


2
然后复制旧项目 - 或将它们移动。 - Steve Jessop

6
一般情况下,即使使用malloc分配了存储空间,C++数组也不能使用realloc重新分配。malloc并不提供数组,而是提供指向可用存储的指针。这里有一个微妙的区别。
对于POD类型(Plain Old Data,普通旧数据类型),可用存储和实际对象之间的差异很小。但对于非POD类型,可用存储和对象完全不同。 realloc会给你更大的可用存储空间。它操作的是“存储”,而不是“对象”。这对于POD类型可能可以正常工作,但对于其他类型来说,却是一场灾难的源头。

从技术上讲,使用realloc()扩展使用calloc()分配的数组是否可能,或者仅当内存通过malloc()分配时才可能使用realloc() - Amal Antony
@amalantony 噢,calloc 也是一样的。问题在于 realloc 本身。它不关心对象,只关心存储空间。 - R. Martinho Fernandes
1
@amal:malloccalloc之间的区别与Martinho在这里所说的完全无关。您不能realloc非POD对象,因为您无法逐字节复制它们,而这就是realloc定义的全部内容。即使在C中,如果您的对象包含指向自身或彼此的指针,则无法realloc它们,因为地址将不再正确。C++只是添加了一个警告,对于非POD类,实现可能会自行插入类似的东西。 - Steve Jessop

0

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