c++ - C++ 中的 Realloc 等价物

标签 c++ dynamic-memory-allocation

是的,另一个 reallocstd::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/

相关文章:

c++ - 在 C++ 中使用模板的问题

c++ - 如何使用curl使用C++代码下载文件?

c++ - 如何传递 const 对象

c++ - 可以创建匿名非常量字符数组吗?

java - 在java中填充未初始化的数组? (或解决方法!)

C++:动态增长二维数组

c++ - 使用 libxml2 sax 解析器获取值错误

c - 如何动态地为结构体赋值

c++ - C++ 中的动态零长度数组

c++ - 为什么我得到 realloc() invalid old size?