模板容器的析构函数

Destructor for a template container

本文关键字:析构函数      更新时间:2023-10-16

我正在C++中构建一个类似Java的ArrayList类,只是为了练习(是的,我知道存在std::vector和其他很好的替代方案(。

我知道new关键字与delete关键字配对,malloc, calloc, reallocfree配对。

因此,假设我有一个类ArrayList,其中包含指向某些泛型类型T的指针。换句话说,我ArrayList中的底层数组如下所示

T* arrayT是一些template <typename T>.

我正在为ArrayList定义我的析构函数,我有几个问题。

  1. 析构函数应负责释放存储在ArrayList中的所有内存。但是我不知道它持有的T*是使用new还是malloc类型创建的,那么我如何解除分配它们呢?我觉得遇到这个问题是反模式的迹象,所以任何建议将不胜感激!

  2. ArrayList本身可以通过两种方式实例化

在堆栈上...

ArrayList arr;

或在堆上...

ArrayList arr = new ArrayList();

如果它是在堆栈上初始化的,我不必担心管理arr的内存,但我是否可以假设它的析构函数将在arr本身以某种方式解除分配之前被调用?

如果它是在堆上初始化的,调用delete arr是否调用其析构函数解除分配arr本身?

谢谢!

解构函数应该负责释放存储在ArrayList中的所有内存。但我不知道它持有的T*是使用新的还是malloc类型的创建的,那么我该如何解除分配它们呢?我觉得遇到这个问题是反模式的迹象,所以任何建议将不胜感激!

你不应该接受任何T*。您是正确的,您无法确定应如何释放此类指针。您应该自己处理分配(就像std::vector一样(,在这种情况下,您不再有此问题。

如果它是在堆栈上初始化的,我不必担心管理arr的内存,但我是否可以假设它的解构函数将在arr本身以某种方式解除分配之前被调用?

是的。当局部变量超出范围时,将销毁该对象(如果有(。这涉及调用其析构函数(再次,如果有的话(。

如果它是在堆上初始化的,调用delete arr调用它的解构函数并释放arr本身吗?

是的。delete arr调用arr的析构函数(再次调用,如果有的话(并释放保留的内存。