易码技术论坛

 找回密码
 加入易码
搜索
查看: 293125|回复: 8

[C++]找出下面代码中的错误……

[复制链接]
发表于 2006-11-17 14:19:25 | 显示全部楼层
  1. ~A() { delete []m_pData; }
复制代码
to
  1. ~A() { if (m_pData) delete []m_pData; }
复制代码
may be...

或者说delete b;的时候不能正确调用A的析构函数?
不解了...
发表于 2006-11-17 14:44:58 | 显示全部楼层
DEBUG监视Memory了,果然delete b;不会调用A的析构释放空间,Memory leak。
在b的类型是A的时候,为new A(100)申请的内存 s_type_is_A.gif
在b的类型是A的时候,delete b会释放掉上面申请的空间 s_type_is_A_2.gif
在b的类型是Base的时候,为new A(100)申请的内存 s_type_is_Base.gif   
在b的类型是Base的时候,delete b并没有释放掉上面申请的空间 s_type_is_Base_2.gif
发表于 2006-11-17 15:35:06 | 显示全部楼层
关于解决方法,基类不能调用派生类的函数,要不然只能考虑重载了,不知道析构可不可以重载哦...
发表于 2006-11-17 15:45:59 | 显示全部楼层
鼓励一下钻研精神~~

虚函数的override应该翻译成覆盖,而不是重载(overload)

析构函数可以为虚,而且一般如果基类中有虚函数的话,析构函数一定要声明成虚的,因为这种情况下一般总会用基类指针指向子类。
 楼主| 发表于 2006-11-17 17:24:49 | 显示全部楼层
因为基类的析构函数没有定义为虚,所以删除一个指向子类的基类指针时,没有调用正确的析构函数。

只有将基类的析构函数定义成虚的,才能保证总是调用到正确的析构函数。所以应该这样解决,只要改动基类的定义就可以:
  1. class Base
  2. {
  3. public:
  4. Base() {};
  5. virtual ~Base() {};
  6. };
复制代码

同时还有一个小技巧。如果想定义一个class,并且仅想让它作为基类而存在,不希望有它的实例,那么需要将其定义为抽象类。抽象类需要有纯虚方法,可以把析构函数声明为纯虚来解决这个问题,一石二鸟:
  1. class Base
  2. {
  3. public:
  4. Base() {};
  5. virtual ~Base() = 0;
  6. };
复制代码
发表于 2006-11-17 18:22:20 | 显示全部楼层
就是virtual啊...我想到了的...可是习惯性的给~A也加上了virtual,编译通不过了...
后来又觉得这两个析构名字不一样,一下子不知道怎么覆盖了...
发表于 2006-11-17 22:38:48 | 显示全部楼层
~A前面也可以加上virtual,当然,前提是A的父类的析构函数也是虚函数。
发表于 2006-11-18 00:00:45 | 显示全部楼层
我试过啊~不能编译通过...
 楼主| 发表于 2006-11-17 14:04:57 | 显示全部楼层 |阅读模式
  1. class Base
  2. {
  3.   public:
  4.   Base() {}
  5.   ~Base() {}
  6. };
  7. class A : public Base
  8. {
  9. public:
  10.   A() {m_pData = NULL;}
  11.   A(int nSize) { m_pData = new int[nSize]; }
  12. ~A() { delete []m_pData; }
  13.   
  14. private:
  15.   int * m_pData;
  16. };
  17. void main()
  18. {
  19.   Base * b = new A(100);
  20.   delete b;
  21. }
复制代码
找出错误,说明原因,应该如何“合理”地改正?
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-28 06:22 , Processed in 0.011360 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表