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不会泄漏任何数据.
如果你有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上删除指针的向量类型,当然可以编写这样的类型.可能已经写过.但要注意删除其他人仍然持有副本的指针.)
归档时间: |
|
查看次数: |
13631 次 |
最近记录: |