我有自定义类,例如:
class MyClass {
public:
int i;
std:string name;
void DoSomeStuff();
}
和另一个包含我的自定义类列表的类:
class MyClassList {
public:
std::vector<MyClasss> myClassList;
}
如何释放列表析构函数以释放内存中所有使用的向量空间:
MyClassList::~MyClassList
{
myClassList.clear();
delete &myClassList;
}
该代码是正确的,多余的还是错误的?
感谢您的帮助...
答案 0 :(得分:5)
你不需要做任何事情,只是让它超出范围。当MyClassList
的实例超出范围时,RAII将确保清理向量内存。
答案 1 :(得分:2)
此代码是多余的(因为Cyber指出甚至不正确,因为您不允许delete
向量)。
请注意,您可以而且必须delete
仅使用new
分配的内容,而且只需new[]
。同样适用于delete[]
和std::vector
。拥有一个必须删除的成员将是你自己的析构函数有意义的情况,尽管将资源处理留给资源处理程序如智能指针和std::vector
通常是可行的方法。
隐式生成的析构函数将以相反的构造顺序破坏所有成员和基础,即它将以正确的顺序调用所有的析构函数。因此,rand()
的析构函数将被调用并释放它拥有的所有资源。
此原则适用于所有精心设计的类,称为RAII。
答案 2 :(得分:0)
由于一切都是在堆栈上创建的,一旦你从List类实例化的对象离开了作用域,它的隐式析构函数就会为你调用std :: vector&#39; s析构函数。如果你想确保你有自己的析构函数,并使用你的成员变量vector&#39; s .clear()来清除它的内容。您需要删除的唯一时间是在堆上创建新内存时!但是我不会使用new和delete,除非new和delete调用在你的类私有方法中并且都在同一个方法中,或者new在构造函数中并且delete在析构函数中。即便如此,使用shared_ptr&lt;&gt;仍然会更好。和unique_ptr&lt;&gt;因为如果你不使用他们的释放方法,当对象失去范围防止内存泄漏时,他们的析构函数会自动为你做 !