关于C ++中的delete运算符

时间:2018-01-18 20:42:21

标签: c++ pointers memory-leaks new-operator delete-operator

我是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

为什么会这样?

0 个答案:

没有答案