我是C ++的新人。
我试图了解一些事情。
使用C ++删除操作符。我学到的是:它解除了ptr指向的内存块(如果不为null),释放先前通过调用operator new分配给它的存储空间。所以我希望如果指针指向一个对象的内存块,它会调用该对象的析构函数方法并删除该对象。 所以我写了这段代码来测试这个:
#include <utility> // std::forward
#include <iostream> // std::cout
using std::cout;
using std::endl;
#include <string>
using std::string;
class Apartment;
class Person {
public:
Person(string n){
cout<<"init Person"<<endl;
name = n;
};
~Person(){
cout<<"Person : "<<name<<" deinit"<<endl;
};
Apartment *apartment = 0 ;
string name;
};
class Apartment {
public:
Apartment(string u){
unit = u;
cout<<"init appartamt"<<endl;
};
~Apartment(){
cout<<"Apartamt : "<<unit<<" deinit"<<endl;
};
Person *tenant = 0;
private:
string unit;
};
这是主要的:
int main(){
Person *emanuele = new Person("Emanauele") ;
Apartment myAparment = Apartment("unit16C");
emanuele->apartment = &myAparment;
myAparment.tenant = emanuele;
cout<<"delete emanuele:"<<endl;
delete emanuele;
emanuele = NULL;
cout<<myAparment.tenant->name<<endl;
}
这是输出:
init Person
init appartamt
delete emanuele:
Person : Emanauele deinit
Emanauele // WHY !!!!!
从输出中可以看出,在调用了person对象的析构函数之后,内存块仍然包含了人的信息,并且可以通过公寓来访问它们。指针通过命令:
myAparment.tenant->name
为什么会这样?