注册 登录
编程论坛 C++教室

一道类的面试题目求解。

LSH744 发布于 2008-11-28 23:07, 753 次点击
//下面的代码有什么问题,为什么,请说明原因

class A
{
public:
  A() { p=this; }
  ~A()
  {
      if(p!=NULL)
      {
          delete p; p=NULL;
      }
  }
  A* p;
};
4 回复
#2
newyj2008-11-28 23:18
没有 new 指针
#3
beyondlwm2008-11-29 02:39
首先,如2L所说,删除指针的工作应该由在他的作用域内完成。即new和delete配对
但是这个并不是错误的,只是不提倡这样做
真正的错误在于,在构造函数中,你的成员变量P=this,也就是说p是一个指向自己的指针
delete p就等于删除自己
析构函数本来就是在删除自己的时候调用的
也就是说,你在删除自己的同时又删除了一遍自己……
譬如
A tempA(A* anotherAobject);
delete tempA;
这个时候,在析构函数中又调用了一次delete p;
实际上p 是完全等价于 tempA的。。
#4
hitcolder2008-11-29 14:21
以下是引用beyondlwm在2008-11-29 02:39的发言:

首先,如2L所说,删除指针的工作应该由在他的作用域内完成。即new和delete配对
但是这个并不是错误的,只是不提倡这样做
真正的错误在于,在构造函数中,你的成员变量P=this,也就是说p是一个指向自己的指针
delet ...


楼上讲的很有道理啊,不过还有点不明白的地方请教下:在A类对象被销毁的时候会自动调用析构函数,那么其实A类本身可以不需要定义析构函数的,它会自动调用默认的析构函数去销毁对象,这么说对吗?
#5
beyondlwm2008-12-01 11:33
可以不定义析构函数
系统会自动调用默认的析构函数
但是这个析构函数是什么都不做的。
也就是说,new出来的对象所占用的空间实际上还是需要手动来释放
1