2012-05-09 2 views
1

В чем проблема с этой программой при выполнении, я хочу, чтобы класс был разрушен, но в конце программы я вижу окно ошибки после извлечения cout. В чем проблема?C++ Ошибка класса разрушения

#include <iostream> 
using namespace std; 

class user { 

    public:int internal; 
    public:user(int point) { 
       internal = point; 
      }; 

      ~user() { 
       cout << "Fetch"; 
      } 
    }; 



void main() { 
    user gil(5); 
    user * p; 
    p=&gil; 
    delete p; 
    getchar(); 
} 
+0

http://www2.research.att.com/ bs/bs_faq2.html # void-main – chris

+2

Общее правило: для каждого 'нового', ровно один' delete'. Для каждого 'new []', точно одного 'delete []'. У вас больше 'delete', чем 'new'. –

ответ

1

Try:

#include <iostream> 
using namespace std; 

class user 
{ 
public: 
    int internal; 
    user(int point) 
    { 
    internal = point; 
    } 

    ~user() 
    { 
    cout << "Fetch" << endl; 
    } 
}; 

int main() 
{ 
    user* p = new user(5); 
    cout << p->internal << endl; 
    delete p; 
    return 0; 
} 

Чтобы избежать использования new/delete и имеет переменную разрушенные производственные, когда он выходит из области видимости:

#include <iostream> 
using namespace std; 

class user 
{ 
public: 
    int internal; 
    user(int point) 
    { 
    internal = point; 
    } 

    ~user() 
    { 
    cout << "Fetch" << endl; 
    } 
}; 

int main() 
{ 
    user p(5); 
    cout << p.internal << endl; 
    return 0; 
} 
+0

@Bill Прислушайтесь к другим ответам и комментариям, поскольку они дают очень хорошее представление о причине этой проблемы. Помня их, когда вы программируете, вы сбережете много головных болей. – Drise

+4

Искушение -1 для рекомендации 'new' /' delete', а не просто использования автоматических переменных. –

+0

@JohnDibling Я добавил альтернативный метод, который, по вашему мнению, был обеспокоен. – Drise

8

delete Вызов на указатель, который не был получен от new не определено поведение. IOW, ваш код неправильный, не делайте этого, gil имеет автоматическое хранилище и будет автоматически уничтожен (duh).

5

Ваш код имеет Неопределенное поведение. Вы вызываете delete на указатель, не выделенный new.
Как только у вас есть неопределенное поведение, все ставки отключены и любое поведение возможно.

Объекты в автоматическом хранилище (стоп) освобождаются после того, как область {}, в которой они созданы, заканчивается, нет необходимости звонить delete для них.

1

Созданный вами класс будет автоматически разрушен, поскольку он выделен в стеке. Вам не нужно использовать оператор удаления на нем. Но если вы просто хотите вызвать функцию деструктора, вы можете это сделать:

gil.~user(); 

Однако я не рекомендую это делать.

+0

Хороший выбор Я хотел сделать это –

+0

@BillGates: Нет, вы этого не делаете. Вы могли бы подумать, что это так, но вы этого не сделаете. –

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