如何删除stl容器?

yes*_*aaj 6 c++ containers memory-management stl vector

容器对象如stl中的vector如何被破坏,即使它们是在堆中创建的?

编辑

如果容器包含指针,那么如何销毁这些指针对象

jmu*_*llo 19

指针的STL容器不会清理指向的数据.它只会清理持有指针的空间.如果您希望向量清理指针数据,则需要使用某种智能指针实现:

{
    std::vector<SomeClass*> v1;
    v1.push_back(new SomeClass());

    std::vector<boost::shared_ptr<SomeClass> > v2;
    boost::shared_ptr<SomeClass> obj(new SomeClass);
    v2.push_back(obj);
}
Run Code Online (Sandbox Code Playgroud)

当该范围结束时,两个向量将释放其内部数组.v1将泄漏创建的SomeClass,因为只有指向它的指针才在数组中.v2不会泄漏任何数据.


der*_*ert 5

如果你有vector<T*>,你的代码需要在删除向量之前删除那些指针:否则,该内存被泄露.

知道C++不做垃圾收集,这里有一个原因的例子(语法错误的应用,自从我编写C++以来已经有一段时间了):

typedef vector<T*> vt;
?
vt *vt1 = new vt, *vt2 = new vt;
T* t = new T;
vt1.push_back(t);
vt2.push_back(t);
?
delete vt1;
Run Code Online (Sandbox Code Playgroud)

最后一行(delete vt1;)显然不应该删除它包含的指针; 毕竟,它也在vt2中.所以它没有.也不会删除vt2.

(如果你想要一个在destroy上删除指针的向量类型,当然可以编写这样的类型.可能已经写过.但要注意删除其他人仍然持有副本的指针.)