繁体   English   中英

使用new关键字和指针的STL向量进行内存管理

[英]Memory management with new keyword and an STL vector of pointers

将元素添加到此列表时,如何管理向量的析构函数? 超出范围时,对象是否被正确销毁? 是否存在无法正确删除对象的情况? 例如,如果“表”是对象的子级,而我们又向对象指针的向量中添加了一个新表,将会带来什么后果?

vector <object*> _objectList;

_objectList.PushBack(new object);

由于您要创建“裸露”指针的向量,因此C ++可能无法知道所讨论的指针是它们所指向的对象的“所有者”,因此当指针指向对象时,它不会调用这些对象的析构函数。指针消失。 您应该使用简单的“智能”指针而不是“裸”指针作为vector的项目。 例如,Boost的shared_ptr将完全适合该任务(尽管您可以肯定地使用“便宜”,轻量级的方法来完成此任务,如果您不想整体处理Boost并不需要其他智能指针的话)在您的代码中)。

编辑 :由于您(OP)说使用诸如Boost之类的框架是不可行的,并且有几条评论有用地指出,即使包装 std::auto_ptr并不能真正成为一个体面的快捷方式,您可能必须实现您的自己的智能指针(或者,如果您发现一个看起来可用的开源独立智能指针模板类,请对其进行审核以符合您的要求)。 本文是C ++中智能指针的有用入门,无论您是必须自己滚动还是审核现有实现。

您可以使用bost'ptr_vector ' 当项目被删除或ptr_vector实例超出范围时,它将自动销毁这些项目指向的对象。 在此处获取更多信息。

在您的情况下,对象指针已正确销毁,但实际对象本身不会被触摸。 STL正确地销毁了所有包含的元素-但不会隐式取消对类型的指针的引用。

STL向量会复制您放置在其中的任何内容,并最终删除该副本。

因此,在这种情况下,向量将存储指向对象的指针,而不是对象本身。 因此,它会复制指针 ,然后删除指针。 但是, 正如克里斯所说 ,该对象本身不会被删除。

因此,解决方案:

如果您真的不需要使用指针,则不要:

vector <object> _objectList;
_objectList.PushBack(object());

如果确实需要使用指针,则可以按照Alex的建议使用智能指针(为您处理引用计数,并将其与指针一起删除),也可以使用Itr 提到的ptr_vector。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM