gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:45:01 25 4
gpt4 key购买 nike

我刚刚发现了一些用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com