模板容器的析构函数

时间:2018-08-22 17:29:25

标签: c++ arrays

我正在C ++中构建一个类似Java的ArrayList类,只是为了进行实践(是的,我知道2018-08-22 22:06:14,583 ERROR o.a.j.p.j.s.JSR223Sampler: Error in Beanshell java.io.FileNotFoundException: csvLineContent (The system cannot find the file specified) at java.io.FileInputStream.open0(Native Method) ~[?:1.8.0_161] at java.io.FileInputStream.open(Unknown Source) ~[?:1.8.0_161] at java.io.FileInputStream.<init>(Unknown Source) ~[?:1.8.0_161] at java.io.FileInputStream.<init>(Unknown Source) ~[?:1.8.0_161] at java.io.FileReader.<init>(Unknown Source) ~[?:1.8.0_161] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_161] at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_161] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_161] at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[?:1.8.0_161] 和其他不错的选择)。

我了解到std::vector关键字与new关键字配对,而deletemalloc, calloc, realloc配对。

因此,假设我有一个类free,其中包含指向某个通用类型ArrayList的指针。换句话说,我的T中的基础数组看起来像这样

ArrayList,其中T* arrayT

我正在为template <typename T>定义析构函数,并且我有几个问题。

  1. 析构函数应负责释放ArrayList中存储的所有内存。但是我不知道它持有的ArrayList是使用T*还是new类型创建的,那么我应该如何对其进行分配?我觉得遇到此问题是反模式的征兆,因此任何建议都将不胜感激!

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

在堆栈上...

ArrayList

或在堆上...

ArrayList arr;

如果它是在堆栈上初始化的,则不必担心管理ArrayList arr = new ArrayList(); 的内存,但是我可以假定它的析构函数将在arr本身被释放之前被调用?

如果它是在堆上初始化的,是否调用arr会调用其析构函数自己释放delete arr

谢谢!

1 个答案:

答案 0 :(得分:1)

  

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

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

  

如果它是在堆栈上初始化的,则不必担心管理arr的内存,但是我可以假设它的析构函数将在arr本身被释放之前被调用?

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

  

如果它是在堆上初始化的,调用delete arr会调用它的析构函数并自己释放arr吗?

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