珍爱生命,远离野指针
2010-09-06 09:16
239 查看
Background
估计只要是C++程序员,没有一个不痛恨这个野指针啦,而对于我们这种只能通过log来debug的程序员来说,其恨更深。Solution
每次看到形如下面的代码时A* p1 = new A;
A* p2 = p1;
…
delete p1;
我都有一种想要将p2也置成空的冲动,但往往都不遂我心愿,因为在实际中p1,p2的出现实在是神出鬼没,让你防不胜防也烦不胜烦。
鲁迅先生说过: 不在沉默中暴发就在沉默中灭亡。幸好,我没有灭亡,所以我要暴发。
在防够了,烦饱了以后,我下定决心,要端掉这个让我受尽折磨地暗堡。
复杂问题的解决方案往往都是简单而“暴力”地,因为问题的难解决一般来说都是因为”暴力”无处着力。我坚信这个规则,所以我的思路很简单,就是要在delete p1的时候把p2也置为空。
计算机科学中有个神话般的格言:计算机科学中的大部分问题都可以通过增加一个中间层来解决。我希望这一次神话能得以延续。
好了,想想吧,我们要解决的问题实际上只有一个,那就是要找一个机制,让p2能知悉它所指向对象的状态(在这里是生命周期)。如果我们把A的生命周期作为一个类提出来,把它叫LifeObject吧,并给每个A的实例一个配备一个LifeObject对象,再让p1和p2指向这个生命周期对象,这样我们只须在A的构造函数中创建一个LifeObject对象,在析构函数中将告诉LifeObject,这样在使用p1和p2的时候就知道当前使用的指针是否是有效的啦。
其关系示意如下:
代码
/* * main.cpp * * Created on: 2010-9-4 * Author: Administrator */ #include "SafePtr.h" #include "SafeObject.h" #include <iostream> using std::cout; using std::endl; class Base1 { public: void output() { cout<<__FUNCTION__<<endl; } }; class Test:public Base1,public SafeObject { public: ~Test() { cout<<__FUNCTION__<<endl; } public: void Fun(void) { cout<<"You invoke fun"<<endl; } }; #include <memory> int main(int argc,char** argv) { SafePtr<Test> pp(new Test); SafePtr<Test> pp1 = pp; if(pp1.NotNull()) { pp1->output(); pp1->Fun(); SafePtr<SafeObject> pp3(pp); cout<<pp3->test()<<endl; } pp.Destroy(); if(pp1.NotNull()) { pp1->Fun(); } SafePtr<Test> pp4 = pp; if(pp4.NotNull()) { pp4->Fun(); } SafePtr<Test> pp5 = pp1; if(pp5.NotNull()) { pp4->Fun(); } return 0; }
Advantage
我想大家已经看出来了,接口的定义和智能指针很相似,只是多了一个Destroy函数而已,所以它的优点就有两个啦:野指针在这儿灰飞烟灭了;
如果不调用destroy函数,它就是一智能指针,用它可以防止内存泄漏。
Disadvantage
虽然它解决了C++中两大问题,但是它的缺点也是有目共睹的,除了常规智能指针的缺陷外它还多出了两个:不能调用delete来销毁一个指针,你要通通换成对Destroy函数的的调用;
如果你想要享受特权公民的待遇,你就得让你的类从SafeObject继承一下。
相关文章推荐
- 珍爱生命,远离“匿名”应用
- 珍爱生命,远离抱怨和抱怨之人。抱怨能让你陷入更惨的境地!
- 珍爱生命,远离JS=>JS避坑记
- 珍爱生命,远离赛门铁克(Symantec)
- 珍爱生命,远离F5之browser-sync+gulp学习
- 珍爱生命,远离泡面!
- 珍爱生命,远离dota
- 珍爱生命,远离毒品升级版
- 为什么“Linux”系统比“Windows”安全 呢?珍爱生命,远离微软!
- 【转帖】请君入翁,远离Java珍爱生命!Java的低成本骗局
- ‘珍爱生命,远离偶像’
- 珍爱生命,远离大论战
- 珍爱生命 远离国足
- 珍爱生命,远离“匿名”应用
- 珍爱生命,远离肥胖,远离过劳死
- 请君入翁,远离Java珍爱生命!Java的低成本骗局
- [转载]6.26国际禁毒日—珍爱生命,远离毒品
- 三八同乐---珍爱生命,远离麻醉
- [转帖]珍爱生命,远离微软,一点感受源自知乎上的某人评论
- 珍爱生命远离ligerui