我正在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
关键字配对,而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
?
谢谢!
答案 0 :(得分:1)
解构函数应负责释放
ArrayList
中存储的所有内存。但是我不知道它持有的T*
是使用新类型还是malloc
类型创建的,那么我该如何取消分配它们?我觉得遇到此问题是反模式的迹象,因此任何建议都将不胜感激!
您不应加入任何T*
。您是正确的,您无法确定应如何释放此类指针。您应该自己处理分配(就像std::vector
一样),在这种情况下,您将不再遇到此问题。
如果它是在堆栈上初始化的,则不必担心管理
arr
的内存,但是我可以假设它的析构函数将在arr
本身被释放之前被调用?
是的。当局部变量超出范围时,对象(如果有)将被销毁。这涉及调用其析构函数(同样,如果有的话)。
如果它是在堆上初始化的,调用
delete arr
会调用它的析构函数并自己释放arr
吗?
是的。 delete arr
调用arr
的析构函数(同样,如果有的话)并释放保留的内存。