Чтобы четко видеть, что происходит, я рекомендую включить в вывод указатель this
, чтобы определить, какой A вызывает метод.
A() {cout<<"A (" << this << ") Construction" <<endl;}
A(A const& a){cout<<"A (" << &a << "->" << this << ") Copy Construction"<<endl;}
~A() {cout<<"A (" << this << ") Destruction" <<endl;}
Результат, который у меня есть,
A (0xbffff8cf) Construction
A (0xbffff8cf->0x100160) Copy Construction
A (0xbffff8cf) Destruction
A (0xbffff8ce) Construction
A (0x100160->0x100170) Copy Construction
A (0xbffff8ce->0x100171) Copy Construction
A (0x100160) Destruction
A (0xbffff8ce) Destruction
A (0x100170) Destruction
A (0x100171) Destruction
Таким образом, поток можно интерпретировать как:
- Создается временный A (…cf).
- Временный A (…cf) копируется в вектор (…60).
- Временный A (…cf) уничтожается.
- Создается еще один временный A (…ce).
- Вектор расширяется, и старый A (…60) в этом векторе копируется на новое место (…70)
- Другой временный A (…ce) копируется в вектор (…71).
- Все ненужные копии A (…60, …ce) теперь уничтожаются.
- Вектор уничтожен, поэтому A (…70, …71) внутри тоже уничтожены.
Шаг 5 исчезнет, если вы это сделаете.
vector<A> t;
t.reserve(2); // <-- reserve space for 2 items.
t.push_back(A());
t.push_back(A());
Вывод станет:
A (0xbffff8cf) Construction
A (0xbffff8cf->0x100160) Copy Construction
A (0xbffff8cf) Destruction
A (0xbffff8ce) Construction
A (0xbffff8ce->0x100161) Copy Construction
A (0xbffff8ce) Destruction
A (0x100160) Destruction
A (0x100161) Destruction
person
kennytm
schedule
17.04.2010