2016-06-23 3 views
0
#include<iostream> 
#include<string> 
using namespace std; 

class Human{ 
    private: 
     int *age; 
     string *name; 
    public: 
     Human(string iname,int iage) 
     { 
      name=new string; 
      age=new int; 
      *name=iname; 
      *age=iage;   
     } 
     void display() 
     { 
      cout<<"Name "<<*name<<endl<<"Age "<<*age<<endl; 
     } 
     ~Human(){ 
      delete name; 
      delete age; 
      cout<<"Released all memories"<<endl; 
     } 

}; 
int main() 
{ 
    Human *pallavi= new Human("pallavi",21); 
    pallavi->display(); 
    delete pallavi; 
    pallavi->display(); 
    return 0; 
} 

Я написал простую программу, которая создает объект класса Human. Деструктор задается для удаления как переменных данных, т. Е. Int age и имени строки. Но при вызове деструктора («удалить Pallavi»), и снова отображать переменные, выход я получаю это:
C++ Деструкторы для освобождения памяти

Имя
Возраст 21

Конечно, весь выход заключается в следующем:

Имя Pallavi
Возраст 21
Освобожденные все воспоминания
Имя
Возраст 21.

Мой вопрос: не должен ли деструктор выпускать воспоминания? Должно ли это не означать, что при отображении объекта второй раз (после вызова деструктора) имя и возраст должны отображать значения мусора? Почему вывод не показывает значения для имени и 21 для возраста?

+2

Как в стороне, вам не нужно использовать указатели для ваших переменных-членов, просто введите их как 'int' и' string'. – Sean

+1

, если вы только начинаете разработку и используете не такой старый компилятор, взгляните на [умный указатель] (http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should -i-use-one) – Garf365

+1

Возможный дубликат [C++ delete - Удаляет мои объекты, но я все еще могу получить доступ к данным?] (http://stackoverflow.com/questions/1930459/c-delete-it-deletes-my -Объекты-но-я-могу-еще-доступ-данные) –

ответ

5

Деструктор делает то, что он должен, но поведение на использование указателя pallaviпосле вы имеете delete д это неопределенными.

Компилятор может делать все, включая печать некоторых объектов. Это может также съесть вашу кошку.

Предположительно, вы используете только элементы указателя в своем классе в качестве упражнения. Делать это «на самом деле» бессмысленно для int и std::string, и даже вредно: экземпляры вашего класса больше не подлежат тривиальному копированию.

1

Вы имеете в виду память, которая уже удалена, это то, что называется неопределенным поведением в C++.

C++ не устанавливает память в ноль, когда вы удаляете ее из кучи.

0

После удаления объект, на который указывает ptr, находится в неопределенном состоянии. Доступ к нему - неопределенное поведение, пока вы снова не вернете адрес действительного объекта в ptr.

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