【发布时间】:2018-08-22 17:29:24
【问题描述】:
我正在 C++ 中构建一个类似 Java 的 ArrayList 类,只是为了练习(是的,我知道std::vector 和其他很好的替代方案存在)。
我了解new 关键字与delete 关键字配对,malloc, calloc, realloc 与free 配对。
所以,假设我有一个类ArrayList,其中包含指向某个泛型类型T 的指针。换句话说,我的ArrayList 中的底层数组是这样的
T* array 其中T 是一些template <typename T>。
我正在为ArrayList 定义我的析构函数,我有几个问题..
析构函数应该负责释放存储在
ArrayList中的所有内存。但我不知道它持有的T*s 是使用new还是malloc-type 创建的,那么我该如何释放它们呢?我觉得遇到这个问题是一种反模式的迹象,所以任何建议都将不胜感激!ArrayList本身可以通过两种方式实例化
在堆栈上...
ArrayList arr;
或在堆上...
ArrayList arr = new ArrayList();
如果它是在堆栈上初始化的,我不必担心管理arr 的内存,但我可以假设它的析构函数会在arr 本身以某种方式被释放之前被调用吗?
如果它是在堆上初始化的,调用delete arr会调用它的析构函数并且释放arr本身吗?
谢谢!
【问题讨论】:
-
1) 你为什么写
ArrayList,如果std::vector就是这样? 2) 通常,容器类管理自己的内存,因此您知道array的内存是如何分配的。提示:您应该尽可能避免使用malloc,因为它不会调用构造函数,而new会调用。 3)通常,类不应该关心它们是如何分配的。它对类内部结构没有任何改变。 -
malloc/free不构造或破坏对象,并且不适用于大多数类类型。new/delete会。 -
如原帖所述,我这样做是为了练习。我不希望
malloc调用构造函数,我假设ArrayList将存储指向预构造对象/基元的指针。 -
@Carpetfizz 但我不知道它持有的 T 是使用新类型还是 malloc 类型创建的,那么我该如何释放它们呢? -- 你不知道,除非客户告诉你如何解除分配。客户端可能刚刚存储了一个非动态创建对象的地址,或者一个使用操作系统 API 调用创建的对象(即 Windows 中的 LocalAlloc)。
-
@Carpetfizz -- 你可以做智能指针类
std::shared_ptr和std::unique_ptr所做的事情。假设“删除器”是delete,并让您的班级拥有客户端提供的自定义删除器。 See here