模板容器的析构函数
Destructor for a template container
我正在C++中构建一个类似Java的ArrayList类,只是为了练习(是的,我知道存在std::vector
和其他很好的替代方案(。
我知道new
关键字与delete
关键字配对,malloc, calloc, realloc
与free
配对。
因此,假设我有一个类ArrayList
,其中包含指向某些泛型类型T
的指针。换句话说,我ArrayList
中的底层数组如下所示
T* array
T
是一些template <typename T>
.
我正在为ArrayList
定义我的析构函数,我有几个问题。
-
析构函数应负责释放存储在
ArrayList
中的所有内存。但是我不知道它持有的T*
是使用new
还是malloc
类型创建的,那么我如何解除分配它们呢?我觉得遇到这个问题是反模式的迹象,所以任何建议将不胜感激! -
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
的析构函数(再次调用,如果有的话(并释放保留的内存。
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 不命名构造函数和析构函数上的类型错误