是的,另一个 realloc
与 std::vector
的问题。我知道你要说什么,我同意,忘记手动内存分配,只使用 std::vector
。不幸的是,我的教授禁止我在这项作业中使用 STL 中的任何内容。
是的,我有一个 T
的动态数组,我需要它可以调整大小,但我不能使用 std::vector
。我可以回到黑暗时代并使用 malloc
和 family 完成所有事情,但如果我可以使用 new
那就太棒了。
我读过很多帖子,每个人都说“不,你不能这样做,使用 std::vector
”,但它们都是在 2011 年 8 月之前发布的,我希望自从 C++11 出现以来,某些事情可能会有所改变。那么告诉我,我是走运了,还是必须恢复到 C 风格的内存分配?
最佳答案
无论如何你应该完全避免realloc
,因为你不能那样移动C++对象。
- 使用
buf = new unsigned char[sizeof(T) * capacity]
创建一个新缓冲区 - 将分配的
unsigned char *
转换为T *
并从现在开始使用这些T
指针 - 通过“placement
new
”构造新元素,如new (&buf[i]) T(original_copy)
- 要将缓冲区复制到更大的缓冲区,首先分配新缓冲区,使用
std::uninitialized_copy
(不是std::copy
),然后使用buf[i].~T()
销毁旧缓冲区中的元素,并使用delete [] buf
释放旧缓冲区。
所有这些都是假设您不必担心异常安全,这对于作业来说可能没问题。
请注意,在现实世界的代码中,您必须保证异常安全,而且它比这更乏味很多。
关于c++ - C++ 中的 Realloc 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15061021/