c++ - 如何在动态数组中的某些对象上调用析构函数

标签 c++ templates placement-new

我终于开始尝试使用 placement new 来创建高效的动态数组。目的是了解它是如何工作的,而不是取代类 vector 。构造函数工作。 block 已分配但未初始化。添加每个元素时,都会对其进行初始化。但我看不到如何使用 placement delete 仅在那些存在的元素上调用析构函数。任何人都可以解释一下吗?这段代码适用于随着数组的增长一个一个地分配元素,但是删除是不正确的。

template<typename T>
class DynArray {
private:
  uint32_t capacity;
  uint32_t size;
  T* data;
  void* operator new(size_t sz, T* place) {
    return place;
  }
  void operator delete(void* p, DynArray* place) {
  }

public:
  DynArray(uint32_t capacity) :
     capacity(capacity), size(0), data((T*)new char[capacity*sizeof(T)]) {}
  void add(const T& v) {
        new(data+size++) T(v);
  }
  ~DynArray() {
     for (int i = 0; i < size; i++)
       delete (this) &data[i];
     delete [] (char*)data;
  }
};

最佳答案

放置 delete 没有多大意义,因为析构函数已经做了放置 delete 应该做的事情。

普通的delete 调用析构函数,然后释放为new 对象分配的内存。然而,与普通的 new 不同,放置 new 不分配内存,它只是初始化它。因此,放置 delete 只需调用要“删除”的对象的析构函数。

你只需要直接调用数组的每个对象的析构函数:

~DynArray() {
   for (int i = 0; i < size; i++)
      data[i].~T();
}

从 C++17 开始,您还可以使用函数模板 std::destroy而不是直接调用析构函数:

~DynArray() {
   auto first = std::addressof(data[0]);
   auto last  = std::next(first, size);
   std::destroy(first, last);
}

关于c++ - 如何在动态数组中的某些对象上调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553396/

相关文章:

C++ 单例 : `Undefined reference to` error

c++ - std::execution::sequenced_policy 有什么用?

c++ - 红黑树插入代码显示段错误 11

c++ - 确定可调用对象是否具有模板参数

c++ - 手动调用析构函数未被评估为引用变量

c++ - 微 Controller 中的 volatile 关键字

c++ - 需要一种方法在仅 header 库中拥有任何类型的模板化常量

html - 如何在 html 代码样式中显示 handlebars 变量?

c++ - 减少临时对象到就地施工的分配

c++ - 单独构造结构体的数据成员是否合法?