资源管理一直是C++被其他语言(例如Java)诟病的地方。不可否认,垃圾回收是更为先进而且便捷有效的管理资源的手段,并且由于其内在的算法改进,它的速度和效率也在逐步提升。但是,毕竟垃圾回收使得程序员离系统内部又远了一步,不但使得程序员对程序内部发生的事情更加不了解(这也是我学了Java却不喜欢使用的原因),而且需要额外运行垃圾回收这段程序,其速率肯定不如自己手动管理好。
随着C++11的推广,资源管理早已不是那么困难(C++11之前也能使用Boost库达到这种效果),new/delete这么难搞的配合基本上可以不用了,因为我们可以使用更为高效便利的标准库和智能指针。
首先,对于在堆栈上建立对象的知识,可以参考以下链接http://www.cnblogs.com/sopc-mc/archive/2011/11/03/2235124.html。
现在,我们不需要再每次都new,然后总得记住要delete(否则内存泄露)。我们所要做的只是把原本希望new的对象交给智能指针管理,之后我们就不需要害怕因为忘记delete而造成内存泄露了,因为智能指针已经帮我们管理好了。那么,智能指针是如何做到这一点呢?其实这里用到了RAII(Resource Acquisition Is Initialization:资源取得时机便是初始化时机),这个RAII其实是利用了class的对象离开作用域时会自动调用析构函数来释放资源,比如:
1 class local 2 { 3 ... 4 }; 5 6 void f() 7 { 8 local l; 9 ... 10 } //leave the function f(), l was deleted by ~local()
当对象l 离开函数f()后,它便自动调用析构函数来释放资源。RAII要的就是这种自动(自动是关键!)调用析构函数的效果!智能指针其实就是一个class,托管了资源罢了,当你需要释放资源时,他就能自动调用自己的析构函数。
接下来就是new数组的问题了,遇到数组我们就得和指针打交道了,指针太顽皮了,恐怕大家都不喜欢和它玩,何况现在我们还得处理new/delete的问题,这让人头都大了。幸好我们还有强大的标准库,这时我们使用vector和string就可以解决90%与数组有关的问题,而这两个东东又是这么容易使用!其实真的,现代的C++编程已经不用整天和指针打交道了,利用好标准库(还有Boost库!),C++编程真的变得高效且方便。
到这里,我们可以总结了:(1)对于单个对象,用智能指针;
(2)对于对象数组,用标准库的vector和string。
最后我引用Scott Meyers的一句话结束本文章:“在一个完美世界中你将倚赖这样的classes来处理和资源之间的所有互动,而不是玷污双手直接处理原始资源。