晓之女神改上限:C++问题,错在哪里?谢谢!

来源:百度文库 编辑:中科新闻网 时间:2024/05/09 19:42:23
class A
{
int *ptra;
public:
A (int x = 0);
~A();

public:
void put();
void set(int x, A obj );
};
A::A(int x)
{
ptra = NULL;
ptra = new int;
assert(NULL != ptra);
*ptra = x;
}
A::~A()
{
assert(NULL != ptra);
delete ptra;
}
void A::put()
{
cout << *ptra << endl;
return;
}
void A::set(int x, A obj)
{
*(obj.ptra) = x;
return;
}
void main ()
{
A a;
a.put();
/*这里对象a是传值调用的方式给函数使用的,但是对象a的成员ptra指向的变量被修改了,而且,在set()结束时候,ptra指向的空间被回收了,所以运行就出错.屏蔽~A()中的代码"delete ptra;"才能不报错.这是为什么啊?
*/
a.set(100, a);
a.put();
return;
}

就是应该报错啊,set函数里面接收了一个按值传递的参数obj,所以obj.ptra与调用时的a.ptra指向同一个空间。
在set函数结束时,作为临时变量的obj就要调用析构函数了,也就是说把obj.ptra指向的内存空间给回收掉了。因此当main函数结束时,a调用析构函数时同一块内存空间就被第二次回收了,肯定是要报错的。

如果一定要这样调用可以编写一个拷贝构造函数:
A::A(A obj)
{
ptra = NULL;
ptra = new int;
assert(NULL != ptra);
*ptra = *(obj.ptra);
}