添加新对象时在向量中销毁对象

时间:2010-05-14 13:31:07

标签: c++

当调用vector的push_back方法时,向量中的前一个对象被破坏可能是原因。

template<typename type> void SomeList<type>::AddElement(type &inObject)
{
    pList.push_back(inObject);// pList is member of my class Vector SomeList 
}

4 个答案:

答案 0 :(得分:4)

可能不是该对象本身被“销毁”,而是在重新分配期间增加向量大小,对象被复制并且旧对象被清理。因此,放入创建和销毁控制程序流动的东西并不是一个好主意。为此,我建议另一个容器对象或smart_ptr

答案 1 :(得分:1)

如果您发布一些代码,我们将有更好的机会帮助您。仅供参考,vector::push_back可能会导致重新分配内部数组,以便它可以增长。那是你的意思吗?

答案 2 :(得分:0)

矢量不会破坏对象。它取代了它。

例如:

vector< A> myVector; // Do some initialization, etc.
A myNewObject;
myVector[0] = myNewObject; // Replace the object.

这意味着将为& A::operator=( const A&)调用赋值运算符(A myVector[0])。那里没有破坏。

当矢量本身被破坏时,或者当重新分配存储器时(在这种情况下,还使用复制构造函数,将对象从旧位置复制到新位置,然后销毁旧位置),完成销毁)。

稍后修改 在push_back情况下,必须通过重新分配来确定销毁。

答案 3 :(得分:0)

  

当调用vector的push_back方法时,向量中的前一个对象被破坏。可能是什么原因。

原因是因此指定了std::vector

当你不断向向量添加元素时,它的某些内存容量会被用尽。然后它会分配一个新的内存储备,将所有旧对象复制到那里(加上你发生时添加的那个),并销毁旧对象。
std::vector试图通过“过度分配”来最小化这一点,它分配的内存超过预期进一步增长所需的内存。 (请查看capacity()size()reserve()resize()的对比以了解详情。)但是,某些保留可能会在某个时候超出,然后必须重新分配和复制。

如果您不想这样做,请查看std::deque的{​​{1}}。