2015-01-02 10 views
1

Я использую компилятор Dev C++. У меня есть этот код:Неверный вывод

#include <iostream> 
using std::cout; 
class Test 
{ 
    public: 
     Test(); 
     ~Test(); 
}; 
Test::Test() 
{ 
     cout << "Constructor is executed\n"; 
} 
Test::~Test() 
{ 
     cout << "Destructor is executed\n"; 
} 
int main() 
{ 
     new Test(); 
     return 0; 
} 

Выходной

Constructor is executed 

В этом коде почему деструктор не вызывается автоматически.

Но когда я пытаюсь этот код:

#include <iostream> 
using std::cout; 
class Test 
{ 
    public: 
     Test(); 
     ~Test(); 
}; 
Test::Test() 
{ 
     cout << "Constructor is executed\n"; 
} 
Test::~Test() 
{ 
     cout << "Destructor is executed\n"; 
} 
int main() 
{ 
     delete new Test(); 
     return 0; 
} 

Выход

Constructor is executed 
    Destructor is executed 

Что является причиной разницы в этих результатах?

+1

Его 'C++' не 'java'. В 'C++' вам нужно самостоятельно управлять памятью. –

ответ

1

Это потому, что delete вызывает деструктор объекта, который вы только что создали с новым.

поэтому в этом случае no delete = no destructor call.

Похоже, вы новичок в C++, поэтому для вашей информации оба объекта создаются в куче. (используйте это для будущих исследований).

0

Вы создали объект на куче. Это означает, что вы должны явно вызвать delete на этом объекте, чтобы выделить выделение памяти, занимаемой этим объектом.

2

Объекты, динамически создаваемые new, не уничтожаются автоматически; они уничтожаются только delete. Ваш первый пример не делает этого (поэтому объект просочился), и ваш второй пример.

Если вы хотите, чтобы быть уничтожен автоматически, а затем дать ему автоматический срок хранения:

int main() 
{ 
    Test t;  // Created here, on declaration 
    return 0;  // Destroyed here, when it goes out of scope 
} 
2

Это, как вы мочиться(), а затем, как только инфракрасный Автоматический туалет писсуара датчик обнаруживает, что вы сделали, он очищает вашу мочу.

{ 
    pee p; 
} 

но Инфракрасная Автоматический туалет писсуаров Датчики не устанавливаются везде, так что вы должны нажать на ручку так, чтобы она промывает ваш пописать.

{ 
    pee *p = new pee(); 
    delete p; 
} 

У вас есть разница сейчас?

+1

Точно мой тип юмора! :-) – Gabriel

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