昨天看到一个知识点觉得挺有意思的,而且自己还不是很清楚,觉得讲得很好。主题是“以对象来管理资源”
C++中用得最多的就是动态的内存分配,程序中的大部分bug也都是源自于内存泄露,这也是C++相较于其他高级语言更复杂的主要原因之一,不过考虑到它强大的功能和超高的效率,这样的复杂度也是应该的,所以上天是公平的,有点扯远了。内存只是我们必须管理的资源之一,其他常用到的资源还包括文件描述符,数据库连接,socket等,不论是哪种资源,我们用完之后必须要归还给操作系统,否则就会出现Memory Leak
看下面一段代码:
#include <iostream>
using namespace std;
class Widget
{
public:
Widget()
{
cout<<"Widget()"<<endl;
}
~Widget()
{
cout<<"~Widget()"<<endl;
}
};
Widget* CreateWidget()
{
Widget* pA = new Widget;
return pA;
}
void MaybeMemoryLeak()
{
Widget* p = CreateWidget();
//....
//....
//....
if(p!=NULL)
return;
delete p;
}
int main()
{
MaybeMemoryLeak();
cout << "Hello world!" << endl;
return 0;
}
乍一看,这段代码没有什么问题,仔细一想,这段代码确实有问题,而且问题很大。在函数“MaybeMemoryLeak()”中极有可能发生内存泄露,这段代码执行下来析构函数没有被调用,也就是发生了内存泄露。原因就在于delete p之前函数已经返回了,所以delete p不会执行。
有人肯定会说只要保证在delete p之前不执行return语句就可以了。貌似是这样,但是如果程序都如我们所预想的逻辑那样跑,那也就没有bug一说了。即使我们在delete p之前保证没有return语句