C ++正确的方法来释放自定义类的向量

时间:2015-04-28 18:43:47

标签: c++ memory vector destructor resource-management

我有自定义类,例如:

class MyClass {

   public:
        int i;
        std:string name;

        void DoSomeStuff();

}

和另一个包含我的自定义类列表的类:

class MyClassList {

    public:
        std::vector<MyClasss> myClassList;
}

如何释放列表析构函数以释放内存中所有使用的向量空间:

MyClassList::~MyClassList 
{
    myClassList.clear();
    delete &myClassList;
}

该代码是正确的,多余的还是错误的?

感谢您的帮助...

3 个答案:

答案 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;因为如果你不使用他们的释放方法,当对象失去范围防止内存泄漏时,他们的析构函数会自动为你做 !