2012-03-06 72 views
2

可能重复:
How do you realloc in C++?重新分配C++数组的内存。

我知道C++阵列可重新分配(扩)使用realloc()如果存储器已经经由malloc()calloc()分配。我的问题是,如何扩展C++中的数组,其内存已通过new运算符分配?

+0

malloc/realloc是C库调用 - 尽管它们可以在C++中使用,但它们通常应该避免使用,因为C++具有更强大的处理动态数组的方式等。 – 2012-03-06 15:17:35

回答

11

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

如果你想这样做,你必须分配一个新的数组(通过new),然后复制旧的项目(例如std::copy),然后delete[]前一个数组。

只需使用std::vector - 让它做所有的东西你...

+3

对于std :: vector。 – 2012-03-06 15:14:53

+1

“然后复制旧的项目” - 或移动它们。 – 2012-03-06 15:36:03

4

一般而言,即使存储被分配了malloc,C++数组也不能被重新分配为reallocmalloc不会给你阵列。它给出了可用存储的指针。这里有一个微妙的区别。

对于POD类型,可用存储和实际对象之间几乎没有区别。但对于非POD类型,可用的存储和对象是完全不同的东西。

realloc为您提供了大部分可用存储空间。它操纵存储不是对象。这对于POD类型可能工作得很好,但对于其他类型而言,这是一种灾难处方。

+0

从技术上讲,只有在已经通过malloc()分配了内存的情况下,才有可能使用'calloc()'分配的realloc()或者''realloc()'来扩展数组。 – 2012-03-06 15:35:36

+0

@amalantony哦,'calloc'也一样。问题在于'realloc'本身。它不关心对象,只关心存储。 – 2012-03-06 15:37:21

+0

@amal:'malloc'和'calloc'之间的区别与Martinho在这里所说的完全无关。你不能'重新分配'non-POD对象,因为你不能将它们逐字节复制,这就是所有'realloc'被定义的。即使在C语言中,如果你的对象包含指向它们自己或彼此的指针,那么你就不能“重新分配”它们,因为地址不再正确。 C++只是增加了对非POD类的警告,实现可能会自动插入类似的东西。 – 2012-03-06 15:37:29