析构函数的奥妙[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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:C++指针专题
- ·下一篇文章:<b>关于指针和内存的几个问题</b>
- ·中查找“析构函数的奥妙”更多相关内容
- ·中查找“析构函数的奥妙”更多相关内容