当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

析构函数的奥妙[VC/C++编程]

赞助商链接



  本文“析构函数的奥妙[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

请看以下一段代码:

class A {
public:
A () { pValue = new int[100]; printf("Constructor of A "); }
~A () { delete [] pValue; printf("Deconstructor of A "); }
private:
int * pValue;
}; class B {
public:
~B () { printf("Deconstructor of B "); }
};
class C : public B {
public:
~C () { printf("Deconstructor of C "); }
private:
A a;
};
int main(int argc, char* argv[])
{
C c;
return 0;
}

类C从类B中担当出来,类C中聚合了一个类A的对象,类C的析构函数并未调用类A的析构函数,请示:这段代码履行后,会调用类A的析构函数释放内存吗?经测试,履行后果以下:

Constructor of A
Deconstructor of C
Deconstructor of A
Deconstructor of B

由此可以看出,C的析构函数确切调用了类A的析构函数,该调用是由编译器隐含加入的,随后还调用了基类B的析构函数,但是请注意,编译器只会为基类和聚合类增添对析构函数的调用,假如C中的成员为指向类A的指针,则编译器不会加入对类A的析构函数的调用.

那么,假如我们把main函数改变一下:

int main(int argc, char* argv[])
{
B * b = new C;
delete b;
return 0;
}

请示:这段代码会发生内存泄露吗?履行后果以下:

Constructor of A
Deconstructor of B

发生了什么?调用了A的构成函数分配了内存,却只调用了B的析构函数,C和A的析构函数都没有调用,内存没有释放,为什么?

有人大概已经看出了问题所在,B和C的析构函数都应当是虚函数,不然,由于b的范例为指向类B的指针,delete b只会调用B的析构函数.当B和C的析构函数都是虚函数时,编译器会按照b指向的对象实际上是C的对象,而去调用C的析构函数.请对代码作以下改变:

class B {
public:
virtual ~B () { printf("Deconstructor of B "); }
};
class C : public B {
public:
virtual ~C () { printf("Deconstructor of C "); }
private:
A a;
};

再次运行,后果精确:

Constructor of A
Deconstructor of C
Deconstructor of A
Deconstructor of B


  以上是“析构函数的奥妙[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 理解finalize()-析构函数的替换者
  • <b>高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(1</b>
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(3
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(4
  • C++中禁止非常信息传送到析构函数外
  • C++的EXIT与析构函数
  • C++面向对象编程入门:构造函数与析构函数
  • <b>C++学习择要之二:构造函数和析构函数</b>
  • 析构函数的奥妙
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .