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