2013-11-26 2 views
1

Мой кодПочему деструктор получает вызов дважды, но конструктор только один раз?

class CTemp{ 
public: 
    CTemp(){ 
     printf("\nIn cons"); 
    } 
    ~CTemp(){ 
     printf("\nIn dest"); 
    } 
}; 

void Dowork(CTemp obj) 
{ 
    printf("\nDo work"); 
} 

int main() 
{ 
    CTemp * obj = new CTemp(); 
    Dowork(*obj); 
    delete obj; 
    return 0; 
} 

Выходной сигнал, который я получаю

In cons 
Do work 
In dest 
In dest 

Теперь почему конструктор дозвонились один раз, а деструктор вызывается дважды? Может ли кто-нибудь объяснить это?

ответ

6
void Dowork(CTemp obj) 

Здесь локальная копия будет сделана, то это будет разрушиться после выхода из сферы DoWork функции, поэтому вы видите деструктор-вызов.

+0

Да. И работа должна занять 'const CTemp &'. –

+0

так, чтобы в этом случае вызывался конструктор копирования? – singh

+0

@singh да. вызываемый по умолчанию экземпляр c-tor будет вызван. – ForEveR

2

Реализовать конструктор копирования и проверьте еще раз:

CTemp(const CTemp& rhs){ 
     printf("\nIn copy cons"); 
    } 
0

Когда функция вызывается его параметр создается с помощью неявного конструктора копирования. Добавить в класс следующий конструктор копирования

CTemp(const CTemp &){ 
    printf("\nIn ccons"); 
} 

, чтобы увидеть еще одно сообщение о создании объекта

0

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

CTemp * obj = new CTemp(); // It will call a constructor to make 
          // a pointer to a constructed object. 

и

Dowork(*obj);    // It will copy `*obj` to the `Dowork` and copy- 
          // constructor will be called to make the argument 

Итак, у вас есть два объекта и два деструктор будет вызван.

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