2016-09-18 4 views
1

У меня есть следующий код:вектора конструктора/деструктор вызывает

#include <iostream> 
#include <vector> 

using std::cout; 
using std::endl; 
using std::vector; 

class A { 
public: 
    int i; 
    A(int i=0):i(i) { 
    cout << "A::A() called" << endl; 
    } 
    ~A() { 
    cout << "A::~A() called" << endl; 
    } 

}; 

int main() { 
    vector<A> *a = new vector<A>(3); 
    delete a; 
} 

Программа печатает:

A::A() called 
A::~A() called 
A::~A() called 
A::~A() called 
A::~A() called 

Почему я вижу один конструктор и четыре деструкторы называются?

Я использую g ++ 4.8.4.

+4

Конструкторы копирования который вызывается – Amadeus

+0

, что выход [неправильно] (http://coliru.stacked-crooked.com/a/4dcfb98936905392) для приведенного выше фрагмента – WhiZTiM

+0

@WhiZTiM Это неправда: http://coliru.stacked-crooked.com/a/1ecb4852b136545d Этот вывод ожидается C++ 03 – Amadeus

ответ

1

Когда вы создаете вектор трех экземпляров A, он заполняется значением по умолчанию. Значение по умолчанию берется из аргумента конструктора вектора. Вы не предоставили его, поэтому он создается либо конструктором без аргументов, либо конструктором со значениями аргументов по умолчанию. Вы предоставили последний, так что первый вызов конструктора.

Все три элемента построены по копиям, поэтому вызов вашего конструктора не требуется.

Затем экземпляр значения по умолчанию уничтожен, поэтому первый деструктор.

Затем вы удаляете вектор, который удаляет все три экземпляра, трижды вызывая деструктор.

Try значение печати this в функциях, чтобы попытаться для себя или попробовать этот образец: http://coliru.stacked-crooked.com/a/903fa70484f5c3bc

+1

Добавление 'A (const A & o) {cout <<" copy-constructor на "<< this << endl; } 'подтверждает этот ответ. –

+0

Примечание: C++ 11 запретил использование векторных записей для копирования, как показано в OP-коде, теперь требуется, чтобы каждая запись была построена по умолчанию, когда вызывающий абонент не предоставлял инициализаторы. –

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

  • Нет связанных вопросов^_^