2010-05-14 98 views
3

当调用vector的push_back方法时,向量中的上一个对象正在被破坏,原因可能是什么。在添加新对象时销毁向量中的对象

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

一些代码,请。矢量通常不会这样做,所以在任何人都可以帮助您之前需要一些背景。 – 2010-05-14 13:32:08

+0

@Marcelos编辑了代码为 – boom 2010-05-14 13:37:46

+0

的查询。将来,突出显示您的代码并单击'101010'按钮进行正确格式化。 – 2010-05-14 13:38:43

回答

0

该向量不会破坏该对象。它取代它。

例如:

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

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

当矢量本身被破坏,或者当内存被重新分配时(在这种情况下,复制构造函数也被用于将对象从旧位置复制到新位置,然后销毁旧的那些)。

后来编辑 在的push_back情况下,破坏必须由一个重分配来确定。

+0

@Catalin:好的,然后在我的代码中,当我调用AddElement方法时,同时调用push_back它在内部调用destroy方法。 – boom 2010-05-14 13:44:35

+0

确切地说,但不是针对每个push_back调用,只有在应该进行重新分配时。 – 2010-05-15 18:26:20

+0

好的,你说的是对的,但这是否意味着向量中的对象被销毁。 – boom 2010-05-17 05:13:53

1

如果您发布了一些代码,我们将有更好的机会帮助您。仅供参考,vector::push_back可能会导致内部阵列重新分配,因此可能会增长。这是你的意思吗?

4

它可能不是该对象本身被“摧毁”,而是在重新分配期间增加矢量大小时,该对象被复制,旧对象被清除。因此,在创造和销毁控制程序流程中加入某些东西并不是一个好主意。为此,我会建议另一个容器对象或smart_ptr

0

当载体的push_back方法是所谓的矢量以前的对象是越来越销毁。这可能是什么原因。

原因是std::vector因此被指定。

当您不断向元素添加元素时,某个点的内存容量已用完。然后它会分配一个新的内存储备,将所有旧对象复制到那里(加上发生时添加的对象),并销毁旧对象。
std::vector试图通过“过度分配”来最小化这种情况,它分配的内存超过预期进一步增长所需的内存。 (查找capacity()size()reserve()resize()以了解更多关于此的信息。)但是每个储备可能在某个时间点被超过,然后它必须重新分配和复制。

如果你不想要这个,看看std::dequestd::list