析构对象后为何还能输出该对象的成员变量的值?解决思路
析构对象后为何还能输出该对象的成员变量的值?
#include <iostream>
using namespace std;
class A
{
public:
A(int i){cout < < "执行构造函数创建一个对象\n ";x=i;}
~A(){cout < < "执行析构函数!\n ";}
int get() {return x;}
void set(int i){x=i;}
private:
int x;
};
A func( );
int main()
{
A *r=&func();
cout < < "对象a的副本的地址: " < <&r < <endl;
cout < <r-> get() < <endl;
return 0;
}
A func( )
{
cout < < "跳转到func函数中!\n ";
A a(23);
cout < < "对象a的地址: " < <&a < <endl;
return a;
}
输出:
跳转到func函数中!
执行构造函数创建一个对象
对象a的地址:0013FF0C
执行复制构造函数创建一个对象
执行析构函数!
执行析构函数!
对象a的副本的地址:0013FF78
23
这个问题大了,为何析构两次后还能输出对象a的成员变量x的值??
------解决方案--------------------
不要认为析构函数调用后,就真的吃掉了你的内存,析构函数只不过告诉你这部分内存现在不再是某一个变量独占的了,你有权访问它,但其它人也有权修改它,在别人没修改之前,你当然能得到原来的值了。
你这个问题,关键在于析构函数啥事都没做,你把类改成这样试试:
class A
{
A(int i):a(new int){*a=i;}
A(A& m):a(new int){*a=m.get();}
~A(){delete a;a=0;}
int get(){return *a;}
void set(int i){*a=i;}
private:
int* a;
}
#include <iostream>
using namespace std;
class A
{
public:
A(int i){cout < < "执行构造函数创建一个对象\n ";x=i;}
~A(){cout < < "执行析构函数!\n ";}
int get() {return x;}
void set(int i){x=i;}
private:
int x;
};
A func( );
int main()
{
A *r=&func();
cout < < "对象a的副本的地址: " < <&r < <endl;
cout < <r-> get() < <endl;
return 0;
}
A func( )
{
cout < < "跳转到func函数中!\n ";
A a(23);
cout < < "对象a的地址: " < <&a < <endl;
return a;
}
输出:
跳转到func函数中!
执行构造函数创建一个对象
对象a的地址:0013FF0C
执行复制构造函数创建一个对象
执行析构函数!
执行析构函数!
对象a的副本的地址:0013FF78
23
这个问题大了,为何析构两次后还能输出对象a的成员变量x的值??
------解决方案--------------------
不要认为析构函数调用后,就真的吃掉了你的内存,析构函数只不过告诉你这部分内存现在不再是某一个变量独占的了,你有权访问它,但其它人也有权修改它,在别人没修改之前,你当然能得到原来的值了。
你这个问题,关键在于析构函数啥事都没做,你把类改成这样试试:
class A
{
A(int i):a(new int){*a=i;}
A(A& m):a(new int){*a=m.get();}
~A(){delete a;a=0;}
int get(){return *a;}
void set(int i){*a=i;}
private:
int* a;
}