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

多夫

我终于开始尝试新的放置方式以创建有效的动态数组。目的是了解其工作原理,而不是替换类向量。构造函数起作用。分配了一个块但未初始化。添加每个元素后,将对其进行初始化。但是我看不到如何使用放置删除仅在存在的那些元素上调用析构函数。谁能解释一个?这段代码用于随着数组的增长一一分配元素,但是删除不正确。

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;
  }
};
斯蒂芬·纽厄尔

实际上,您发现了唯一要手动调用析构函数的情况(至少我知道):

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

与简单的类和结合使用main,您应该获得预期的结果:

struct S {
    ~S() { std::cout << __PRETTY_FUNCTION__ << '\n'; }
};

int main() {
    DynArray<S> da{10};
    da.add(S{});
    return 0;
}

请注意,您会看到析构函数调用了两次,因为DynArray它通过const引用来获取对象,因此它具有临时性。

$./a.out 
S::~S()
S::~S()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否在Exit()上调用基本对象析构函数?

什么时候在堆中的对象上调用C ++析构函数?

如何构造具有删除的析构函数的动态对象?

析构函数删除main中声明的动态数组

析构函数可以在const对象上调用非const函数吗?

使用Vector创建对象时如何调用析构函数

如何阻止析构函数在堆栈分配的对象上被调用?

不要在不完整的对象上调用析构函数(PHP 7.1不兼容的更改)

如何在移动分配运算符中调用析构函数?

在函数调用期间析构对象

std::map 对象析构函数被调用?

如何理解CPP中的调用析构函数方法?

C ++构造函数/析构函数调用&在动态创建的数据上调用“ new”会删除旧数据吗?

在析构函数中的唯一指针上调用reset的C ++语义

在新的放置缓冲区上调用析构函数?

在postOrderDeletion上调用析构函数时引发异常

析构函数中的动态转换

您如何调用析构函数,或者何时在pybind11中从python自动调用析构函数?

如何在JavaScript中的对象上调用构造函数?

析构函数调用

如何在javascript中的对象数组上调用方法?

如何在CRTP中实现析构函数?

如何在类析构函数中关闭工作簿?

如何在es6中创建析构函数

C ++-如何在析构函数中删除子类

为什么数组中的对象的析构函数被另一个替换时没有被调用?

C ++如何自动调用析构函数?

如何指定析构函数调用的顺序?

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