山东省商务厅网站开发区管理处网站制作基本流程
以对象管理资源
有这样一段代码:
class A { public:A* create(){...}}; class B :public A { public:A* ptr = create();...delete ptr; };
我们定义了ptr去接收create()函数的返回值,并且在最后进行了回收资源。看似是没问题的。但是实际上有很多隐患:
1.delete前的...或许有一个过早的return语句
2.delete语句位于某个循环内,也许会进行过早的goto或者break
3.delete前的...或许有一个异常抛出
所以这样写并不是最佳的。
那如何写呢?
引入C++11的智能指针
class B :public A { public:auto_ptr<A> ptr(create());...};
不论控制流如何离开区块,一旦对象被销毁其析构函数自然会被自动调用,于是资源被释放
但是auto_ptr 的劣势也很明显:如果它被拷贝了并且同时指向一块内存,当其中一个指针释放这块资源时,另一个指针就会变成野指针。
怎么办?
利用其他的智能指针
shared_ptr :
利用计数的思想,当多个指针同时管理一块资源时,每释放一个指针,计数减一,直到0便释放资源。避免了野指针的问题。
unique_ptr:
不允许拷贝,更杜绝了以上问题。
weak_ptr:
针对unique_ptr的缺陷(循环引用)进行填补.
所以:
1.为了防止资源泄漏,请使用RAII对象
2.尽量少使用auto_ptr