c++ - 在容器中使用 placement new

标签 c++ memory-management placement-new object-construction object-destruction

我刚刚发现了一些用 C++ 实现的容器。该类使用内部缓冲区来管理其对象。这是一个没有安全检查的简化版本:

template <typename E> class Container
{
public:
   Container() : buffer(new E[100]), size(0) {}
   ~Container() { delete [] buffer; }

   void Add() { buffer[size] = E(); size++; }
   void Remove() { size--; buffer[size].~E(); }

private:
   E* buffer;
   int size;
};

据我所知,如果 new,这将在 Container()~Container() 中冗余地构造/销毁 E 对象>/delete 不是自定义的。这看起来很危险。

Add() 中使用放置 new 是否是防止危险的冗余构造函数/析构函数调用的最佳方法(除了将类绑定(bind)到功能齐全的池之外)?

当使用放置 new 时,new char[sizeof(E)*100] 是否是分配缓冲区的正确方法?

最佳答案

AFAIK this will construct/destruct E objects redundantly

看起来是这样。 newed 数组已经应用了默认构造函数,delete[] 也会为所有元素调用析构函数。实际上,Add()Remove() 方法除了维护 size 计数器外几乎没有添加。

When using placement new, would new char[sizeof(E)*100] be the correct way for allocating the buffer?

最好选择 std::allocator已经为您处理了所有内存问题。

使用放置 new 并自行管理内存需要您了解许多问题(包括);

  • 对齐
  • 分配和使用的大小
  • 破坏
  • 安置等施工问题
  • 可能的别名

这些都不是不可能克服的,只是在标准库中已经做到了。如果您有兴趣使用自定义分配器,global allocation functions (void* operator new (std::size_t count);) 将是内存分配的合适起点。


无需进一步解释代码的原始用途 - std::vectorstd::array 将是管理元素的更好选择容器。

关于c++ - 在容器中使用 placement new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35129485/

相关文章:

c++ - 使 std::vector 分配对齐的内存

c++ - 在封闭对象的生命周期内通过 placement new 重用数据成员存储

syntax - Rust 中的 <- 符号是什么?

c++ - begin() 和 rend() 有什么区别?

c++ - 在不复制数据的情况下拆分 OpenCV Mat

C++ 内存泄漏 - 我应该删除什么,在哪里删除?

c - 需要帮助查找错误,如果字符串输入由所有相同字符组成,则输出字符已损坏

c++ - C++中的析构函数直接调用

c++ - 具有两个变量的 "for"循环,一个变量每次迭代递增,每隔一个迭代递增

linux - 在 fork 之前或之后在磁盘文件上调用 mmap() 有什么区别?