2010-05-14 3 views
3

Когда метод вектора push_back называется предыдущим объектом в векторе, он уничтожается, что может быть причиной этого.уничтожение объекта в векторе при добавлении нового объекта

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

Некоторые коды, пожалуйста. Векторы обычно этого не делают, поэтому необходим какой-то контекст, прежде чем кто-нибудь сможет вам помочь. –

+0

@Marcelos отредактировал запрос с кодом – boom

+0

В будущем выделите свой код и нажмите кнопку '101010', чтобы отформатировать его правильно. –

ответ

0

Вектор не разрушает объект. Он заменяет его.

Например:

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

Это означает, что оператор присваивания (А & A::operator=(const A&)) будет вызываться для myVector[0]. Там нет разрушений.

Уничтожение происходит, когда сам вектор разрушается или когда память перераспределяется (в этом случае используется также конструктор копирования, чтобы скопировать объекты из старого местоположения в новое место, прежде чем уничтожить старый из них).

Позже отредактируйте В случае push_back уничтожение должно быть определено путем перераспределения.

+0

@Catalin: ok, тогда в моем коде, когда я вызвал метод AddElement, при вызове push_back он внутренне вызывает метод destroy. – boom

+0

Точно, но не для каждого вызова push_back, только при перераспределении. –

+0

Хорошо, это верно, но означает ли это, что объекты в векторе уничтожены. – boom

1

Если вы разместите какой-либо код, у нас будет гораздо больше шансов помочь вам. FYI, vector::push_back может привести к перераспределению внутреннего массива, чтобы он мог расти. Это ты имел в виду?

4

Возможно, не так, что объект «разрушен» как таковой, а скорее во время перераспределения, чтобы увеличить векторный размер, который объект копирует со старой, очищаемой. Следовательно, не рекомендуется включать что-то, в котором поток программ создания и уничтожения. Для этого я предлагаю другой контейнерный объект или smart_ptr.

0

Когда метод push_back вектора называется предыдущим объектом в векторе, он уничтожается. Что может быть причиной этого.

Причина в том, что std::vector указан таким образом.

Когда вы продолжаете добавлять элементы к вектору, в какой-то момент его объем памяти исчерпан. Затем он выделяет новый резерв памяти, копирует туда весь старый объект (плюс тот, который вы добавляете, когда это происходит), и уничтожает старые объекты.
std::vector пытается минимизировать это путем «чрезмерного выделения», он выделяет больше памяти, чем требуется, чтобы ожидать дальнейшего роста. (Ищите capacity() против size() и reserve() против resize(), чтобы узнать больше об этом.) Но каждый резерв может быть в какой-то момент превышен, а затем он должен перераспределить и скопировать.

Если вы не хотите этого, взгляните на std::deque из std::list.

Смежные вопросы