什么时候需要手动调用析构函数调用顺序

#include &iostream&usingnamespaceclass MyClass{public:
cout &&"Constructors"&&
~MyClass()
cout &&"Destructors"&&
}};int _tmain(int argc, _TCHAR* argv[]){
MyClass* pMyClass =new MyC
pMyClass-&~MyClass();
delete pMyC}
Constructors
Destructors&&&&&&& //这个是显示调用的析构函数
Destructors&&&&&&& // 这个是delete调用的析构函数
这有什么用?&
有时候,在对象的生命周期结束前,想先结束这个对象的时候就会派上用场了。
由此想到的:&
因为我知道。
new的时候,其实做了两件事,一是:调用malloc分配所需内存,二是:调用构造函数。
delete的时候,也是做了两件事,一是:调用析造函数,二是:调用free释放内存。
所以推测构造函数也是可以显式调用的。做了个实验。
int _tmain(int argc, _TCHAR* argv[]){
MyClass* pMyClass = (MyClass*)malloc(sizeof(MyClass));
pMyClass-&MyClass();
编译pMyClass-&MyClass()出错:
error C2273: 'function-style cast' : illegal as right side of '-&'operator
天啊,它以为MyClass是这个类型。
解决办法有两个:
第一:pMyClass-&MyClass::MyClass();第二:new(pMyClass)MyClass();
第二种用法涉及C++ placement new 的用法。
placement&new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。请查阅placement&new相关资料。
显示调用构造函数有什么用?&
有时候,你可能由于效率考虑要用到malloc去给类对象分配内存,因为malloc是不调用构造函数的,所以这个时候会派上用场了。
另外下面也是可以的,虽然内置类型没有构造函数。
int* i = (int*)malloc(sizeof(int));new (i) int();
感觉这些奇奇怪怪的用法最好在写代码库时,为了达到某个目时去使用,不推荐应用开发时使用。
本文地址:析构函数通俗谈_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
析构函数通俗谈
上传于|0|0|文档简介
&&析构函数通俗地讲下 可能有点不恰当 随便看看吧
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢17329人阅读
为什么要说&也&?用google搜索&析构函数&是,google会说&约有81,500项符合 析构函数 的查询结果&,我最近复习c++是有所心得,所以&也&想谈谈&析构函数&。我不想像教科书似的介绍它,而是从它何时被调用来浅谈一下。析构函数在下边3种情况时被调用:1.对象生命周期结束,被销毁时;2.delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时;3.对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。情况1请看下边代码:#include&iostream.h&class A{&public:&A()&{&&cout&&&constructing A&&&&}&&~A()&{&&cout&&&destructing A&&&&}&private:&};class B: public A{&public:&B()&{&&cout&&&constructing B&&&&}&~B()&{&&cout&&&destructing B&&&&}&private:&};void main(){&B}运行结果为:constructing Aconstructing Bdestructing Bdestructing A上述代码还说明了一件事:析构函数的调用顺序与构造函数的调用顺序相反。情况2则正好说明了为什么基类应该把析构函数声明为虚函数,请先看下边的例子:#include&iostream.h&class A{&public:&A()&{&&cout&&&constructing A&&&&}&&~A()&{&&cout&&&destructing A&&&&}&private:&};class B: public A{&public:&B()&{&&cout&&&constructing B&&&&}&~B()&{&&cout&&&destructing B&&&&}&private:&};void main(){&A* a = new B;&}运行结果为:constructing Aconstructing Bdestructing A若将class A中的析构函数声明为虚函数,运行结果将变成:constructing Aconstructing Bdestructing Bdestructing A由此还可以看出虚函数还是多态的基础,才c++中没有虚函数就无法实现多态。因为不声明成虚函数就不能&推迟联编&,所以不能实现多态。这点上和java不同,java总是&推迟联编&的,所以也剩了这些麻烦。扯远了,再看情况3,通过下边代码表示:#include&iostream.h&class A{&public:&A()&{&&cout&&&constructing A&&&&}&~A()&{&&cout&&&destructing A&&&&}&private:&};class C{&public:&C()&{&&cout&&&constructing C&&&&}&~C()&{&&cout&&&destructing C&&&&}&private:&&};class B: public A{&public:&B()&{&&cout&&&constructing B&&&&}&~B()&{&&cout&&&destructing B&&&&}&private:&&C};void main(){&B}运行结果为:constructing Aconstructing Cconstructing Bdestructing Bdestructing Cdestructing Ab的析构函数调用之后,又调用了b的成员c的析构函数,同时再次验证了析构函数的调用顺序与构造函数的调用顺序相反。若将上边的代码中的main()函数内容改成&A* a = new B;&&由情况2我们知道,这将不会调用class B的析构函数不会被调用,所以class C的析构函数也不会被调用。正如我们想的,运行结果为:constructing Aconstructing Cconstructing Bdestructing A俗话说温故而知新,我却不想做什么师,只是希望能够和大家分享一下对析构函数和虚析构函数的更深的认识。以上代码在VC++6.0上测试通过,如有疏漏或错误的认识请大家指正:)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94048次
排名:千里之外
原创:14篇
评论:36条
(2)(1)(1)(2)(1)(2)(1)(1)(3)(2)(1)(6)
() () () () ()

我要回帖

更多关于 c 析构函数何时调用 的文章

 

随机推荐