可能是重复问题:
如何在C++中使用
如何在C++中使用
realloc()
?
我知道如果内存是通过malloc()
或calloc()
分配的,可以使用realloc()
扩展C++数组。我的问题是,如果内存是通过new
运算符分配的,我该如何扩展C++数组呢?realloc()
?
我知道如果内存是通过malloc()
或calloc()
分配的,可以使用realloc()
扩展C++数组。我的问题是,如果内存是通过new
运算符分配的,我该如何扩展C++数组呢?你不能这样做 - 这就是为什么在C++中你要使用std::vector<>
。
如果你想这样做,你必须先分配一个新的数组(通过new
),然后拷贝旧的元素到新的数组中(例如使用std::copy
),最后删除之前的数组。std::vector
可以替你完成所有这些步骤...
malloc
分配了存储空间,C++数组也不能使用realloc
重新分配。malloc
并不提供数组,而是提供指向可用存储的指针。这里有一个微妙的区别。realloc
会给你更大的可用存储空间。它操作的是“存储”,而不是“对象”。这对于POD类型可能可以正常工作,但对于其他类型来说,却是一场灾难的源头。realloc()
扩展使用calloc()
分配的数组是否可能,或者仅当内存通过malloc()
分配时才可能使用realloc()
? - Amal Antonycalloc
也是一样的。问题在于 realloc
本身。它不关心对象,只关心存储空间。 - R. Martinho Fernandesmalloc
和calloc
之间的区别与Martinho在这里所说的完全无关。您不能realloc
非POD对象,因为您无法逐字节复制它们,而这就是realloc
定义的全部内容。即使在C中,如果您的对象包含指向自身或彼此的指针,则无法realloc
它们,因为地址将不再正确。C++只是添加了一个警告,对于非POD类,实现可能会自行插入类似的东西。 - Steve Jessop