2016-10-04 4 views
-5

У меня есть класс. конструктор выполняется без проблем. но WHUT деструктор не выполняет после завершения программы? Я был бы признателен за любую помощь.Деструктор не исполняется

class foo{ 
    foo(){ 
    cout<<"This is constructor!"<<endl; 
    } 
    ~foo{ 
    cout<<"This is destructor! "<<endl; 
    } 
}; 

int main(){ 

foo* temp; 
temp = new foo(); 

/*some code*/ 

return 0; 
} 
+2

Потому что у вас есть утечка памяти. – juanchopanza

+0

Я бы предложил взглянуть на некоторые из этих книг (http://stackoverflow.com/q/388242/2069064). – Barry

+0

Вы всегда можете заставить его сделать «удаление темпа» перед выходом; – infixed

ответ

0

Поскольку вы выделили память для объекта dynamically (с помощью new оператора в программе), вы должны освободить его с помощью delete оператора. Не делая этого, вы создаете memory leaks. Это означает, что вам нужно отслеживать выделенную вами память и освобождать ее, когда она вам больше не нужна. Вы можете прочитать о memory leaks over here.

Однако, для объектов automatic, destructor будет называться неявно, когда объект выходит за пределы области действия. Например,

int main() 
{ 
    foo temp; 
    // Do Something Interesting 

    return 0; 
} 

Выход выше программы покажет вам Destructor называют.

Кроме того, есть и другие проблемы с вашей программой. Во-первых, вы не объявили конструктора и деструкторов для вашего класса foo под номером Public. А во-вторых, вы забыли пару круглых скобок с Destructor ~foo. Компилятор будет вызывать ошибку, если вы попытаетесь скомпилировать свою программу. Правильная программа приведена ниже:

#include <iostream> 
using namespace std; 

class foo { 
public: 
    foo() { 
     cout<<"This is constructor!"<<endl; 
    } 
    ~foo() { 
     cout<<"This is destructor! "<<endl; 
    } 
}; 

int main() { 

    foo* temp; 
    temp = new foo(); 

    /*some code*/ 

    delete temp;  
    return 0; 
} 
1

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

class foo{ 
    foo(){ 
    cout<<"This is constructor!"<<endl; 
    } 
    ~foo{ 
    cout<<"This is destructor! "<<endl; 
    } 
}; 

int main(){ 

foo* temp; 
temp = new foo(); 

/*some code*/ 

delete temp;  // Decinstruct when pointer is deleted 
return 0; 
} 
2

Память к переменным может быть назначена тремя способами. Это:

1) Автоматический: переменная с автоматическим распределением памяти будет уничтожена после закрытия цикла.

2) Статический: переменная со статическим распределением памяти будет иметь память до начала запуска программы и будет уничтожена в конце программы.

3) Динамический: переменная с динамическим распределением памяти получает свою память, выделенную с помощью команды new, и их можно удалить только с помощью ее эквивалентной команды delete.

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

Надеюсь, это вам поможет.

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