2012-06-12 48 views
2

我有一个包含向量成员变量的类。 我知道存储在堆栈上的向量在 范围内时会被清除(即释放内存) ,但我不确定是否销毁了包含向量成员变量的 类对象 - 被视为超出范围。C++删除析构函数中的向量类成员内存

如果不是,有什么适当的方法来破坏 的载体?

EG:

class fred { 
    char *stuff; 
    vector<int> v; 

    fred() : stuff(), v() {} 
    ~fred() { 
     if (stuff) free(stuff); 
     // now how do I clear up the vector v? Will it be done automatically? 
    } 
} 
+2

看到它是如何标记C++的,你可能希望'new/delete'在'malloc/free'上。 – chris

+2

矢量是好的。但'stuff'由于复制构造函数和赋值操作符而不安全(因为编译器会自动生成它们)。查看三条规则(或C++ 11中的五条规则)。 –

+1

在新的世界中,C++ 11-land,你不再自己调用delete。您可以使用unique_ptrs(通常)或shared_ptrs(很少)来为您调用它。 – David

回答

0

当你摧毁弗雷德的实例为载体的析构函数将被调用。

+2

'v'不一定就在堆栈上!这取决于这个'fred'的实例是否被分配到堆栈上 – David

+0

哦,对了!没有考虑这种情况:( 感谢您的支持 – mtahmed

+0

如果它具有自动存储持续时间,即堆栈分配实例,他可能不需要*销毁* fred实例 – Praetorian

5

该矢量已为您清理!当一个类被破坏时,它的所有成员析构函数也被调用。在这种情况下v的析构函数被调用,它清除它分配的任何东西。

当您按照与声明相反的顺序到达关闭析构函数}时,调用非静态成员的dtors。然后调用基类析构函数(如果存在)。

+0

这很好,但我认为如果我为这个类编写我自己的析构函数(不依赖于默认的析构函数),那么就不会发生这种自动清理。将被调用,即使我有一个显式的析构函数?? – bandjalong

+1

是的。对于所有非静态非指针成员对象,当你到达这个成员的顺序时,dtor会自动调用在类定义中定义(然后调用基类dtors,然后删除基类成员,如果有的话,等等...)。 – dirkgently

+0

@dirkgently纠错:成员被调用_reclared_在_reclared_类_declaration_ – David

0

我认为你不需要为矢量调用DTOR。 DTOR将在对象超出范围时立即被调用,这意味着fred的DTOR被调用。

0

总是只有一种方法可以销毁一个对象,这是通过它的析构函数(相反,你可以用多种方式构造对象)。 STL容器专门设计用于避免数据结构中存储器的这种微观管理。如果你不得不在STL容器中显式地分配或释放内存,那么你做错了。