【发布时间】:2010-12-28 14:31:54
【问题描述】:
向该列表添加元素时,向量的析构函数是如何管理的?对象超出范围时是否正确销毁?是否存在无法正确删除对象的情况?例如,如果“表”是对象的子对象,并且我们将新表添加到对象指针向量中,会有什么后果?
vector <object*> _objectList;
_objectList.PushBack(new object);
【问题讨论】:
向该列表添加元素时,向量的析构函数是如何管理的?对象超出范围时是否正确销毁?是否存在无法正确删除对象的情况?例如,如果“表”是对象的子对象,并且我们将新表添加到对象指针向量中,会有什么后果?
vector <object*> _objectList;
_objectList.PushBack(new object);
【问题讨论】:
由于您正在制作“裸”指针的向量,C++ 不可能知道所讨论的指针意味着拥有它们指向的对象的“所有权”,因此它不会调用这些对象'指针消失时的析构函数。您应该使用简单的“智能”指针而不是“裸”指针作为vector 的项目。例如,Boost 的shared_ptr 将完全适合该任务(尽管如果您不想将 Boost 作为一个整体处理并且没有其他需要代码中的智能指针)。
编辑:因为您(OP)说使用诸如 Boost 之类的框架是不可行的,并且一些 cmets 有用地指出,即使 包装 std::auto_ptr并不能真正成为一个体面的快捷方式,您可能必须实现自己的智能指针(或者,如果您发现一个看起来可用的开源、独立的智能指针模板类,请审核它是否符合您的要求)。这个article 是 C++ 中智能指针的有用入门,无论您必须自己滚动还是审核现有实现。
【讨论】:
STL Vectors 会复制您放入其中的任何内容,并最终删除该副本。
所以在这种情况下,向量存储的是一个指向对象的指针——而不是对象本身。所以它会复制指针,并删除指针。但是,as Chris said,对象本身不会被删除。
如果你真的不需要使用指针,那就不要:
vector <object> _objectList;
_objectList.PushBack(object());
如果您确实需要使用指针,您可以使用智能指针(它为您处理引用计数,并将与指针一起删除对象),如 Alex suggested,或使用 ptr_vector,as Igor mentioned .
【讨论】:
您可以使用 bost 'ptr_vector'。当项目被删除或ptr_vector 的实例超出范围时,它将自动销毁项目指向的对象。更多信息可通过here获得。
【讨论】:
在您的情况下,对象指针被正确销毁,但实际对象本身不会被触及。 STL 正确地破坏了所有包含的元素 - 但不会隐式取消引用指向类型的指针。
【讨论】:
delete 指针。