Откуда начинается первое разрушение?

Я пытался практиковать следующий код:

#include <iostream>
#include <vector>

using namespace std;

class A
{
public:
 virtual void f(){cout<<"A"<<endl;} virtual="" ~a(){cout<<"destruct="" a"<<endl;}="" };="" int="" main()="" {="" a="" o1,o2;="" vector="" <a=""> O;
 O.push_back(o1);
 cout<<"1"<</endl;}></vector></iostream>
<p> Результаты оказались:</p> <pre class="prettyprint linenums">1 destruct A test destruct A destruct A destruct A destruct A </pre> <p> Путайтесь о том, откуда приходит первый деструктор.</p>
3 ответа

После того, как у нас были инструкции print к конструктору копирования, мы получим следующее:

constructor A(0x7fff6e21e800)
constructor A(0x7fff6e21e7f8)
copy A(0x10e700910: From 0x7fff6e21e800)
1
copy A(0x10e700920: From 0x10e700910)
copy A(0x10e700928: From 0x7fff6e21e7f8)
destruct A(0x10e700910)
test
destruct A(0x10e700920)
destruct A(0x10e700928)
destruct A(0x7fff6e21e7f8)
destruct A(0x7fff6e21e800)

Итак, теперь давайте посмотрим на код:

int main()
{
 A o1,
 // constructor A(0x7fff6e21e800)
 o2;
 // constructor A(0x7fff6e21e7f8)
 vector  O;
 O.push_back(o1);
 // copy A(0x10e700910: From 0x7fff6e21e800)
 cout<<"1"<


Ваш вектор перераспределил буфер памяти во втором вызове push_back. Это потребовало, чтобы объект, который был там, был скопирован в новый буфер, а исходный объект был уничтожен.

Если вы O.reserve(2) прежде чем вставлять какие-либо объекты, это даст вашему вектору достаточно места для размещения обоих объектов. Таким образом, его не нужно перераспределять, и вы не должны видеть никаких разрушений до конца основного. Технически может быть больше разрушений, если ваш компилятор сосет и делает ненужные копии. Однако, из того, что вы показали до сих пор, похоже, что это не так.


Сделайте конструктор и деструктор напечатайте адрес памяти объекта, чтобы вы могли следить за его жизнью:

virtual void f() { cout << "A: " << std::hex << this << endl; }
virtual ~A(){ cout << "destruct A: " << std::hex << this << endl; }

licensed under cc by-sa 3.0 with attribution.