2016-11-19 4 views
2

Я объявил простой класс с конструктором и деструктором. Но, когда я удаляю объект, он дает runtime error и не выполняет никакого последующего вывода.Как удалить этот объект?

class Student { 
public: 
    string name; 

    Student(string name) { 
     this->name=name; 
    } 

    ~Student() { 
     this->name=""; 
    } 

}; 

int main() { 
    Student* s = new Student("a"); 
    cout<<s->name<<endl; 
    delete s;         /// Problem In This Line 
    cout<<"Name Here -> "<<s->name<<endl; 
    return 0; 
} 

В чем моя проблема? Как удалить или вызвать деструктор?

+4

После удаления указателя вы не можете его использовать. –

+0

Спасибо. Я понял. @ Code-Apprentice – jbsu32

ответ

2

После удаления указателя вы не сможете его использовать. Если вы хотите показать, что ваш деструктор работал, поместите в него инструкцию сокращения, а не в main().

2

В чем моя проблема? Как удалить или вызвать деструктор?

После того, как вы отправили delete s, объект исчез, так что, конечно, вы больше не можете иметь к нему доступ. Доступ к объекту за пределами его жизни является типичным неопределенным поведением.

Для вашего случая просто измените порядок вашего кода.

cout<<"Name Here -> "<<s->name<<endl; 
delete s; 
1

As @ Code-Apprentice said. Как только вы уничтожаете объект, выделенная для этой цели память освобождается, поэтому в вашем примере вы пытаетесь достичь блока нераспределенной памяти, и это приводит к тому, что называется NPE (NullPointerException).

+0

В C++ отсутствует NullPointerException, и указатель указывает на что-то, это не пусто – Rakete1111

+0

Исключение NullPointerException было одним из способов описания потенциальной ошибки указания нулевого значения. Я забыл сказать, что это исключение - это то, что оно называется на Java. Тем не менее, вы правы. После использования удаления память освобождается и готова к использованию снова, именно это. Было ошибкой сказать, что оно указывает на нуль, потому что это то, что предлагается сделать вручную после уничтожения объекта. Я исправляю себя в этом комментарии и добавляю интересную тему. http://stackoverflow.com/questions/11603005/what-does-delete-command-really-do-for-memory-for-pointers-in-c – cizambra

1

Невозможно позвонить ему после его удаления из кучи. Так что если вы хотите использовать эту линию

cout<<"Name Here -> "<<s->name<<endl;

вы должны перестроить свою программу таким образом, его использовали перед удалением Student объекта s

1

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

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