August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
通过定义构造函数、拷贝操作、移动操作和析构函数,程序员就能对包含的资源(比如容器中的元素)的生命周期提供完全的控制。而且移动构造函数还允许对象从一个作用域简单高效地移动到另一个作用域。这样,对于我们不能或不希望拷贝出作用域的对象,就可以简单高效地移出作用域。考虑一个表示并发活动的标准库thread(参见15.2节)以及一个含有1000000个double的Vector。对于前者,我们无法拷贝它;对于后者,我们则是不希望拷贝。
在很多情况下,使用Vector和thread这样的资源句柄要优于直接使用内置指针。实际上,标准库“智能指针”(如unique_ptr)本身就是资源句柄(参见13.2.1节)。
我们使用标准库vector存放thread的原因是,在6.2节之前我们还接触不到用一种元素类型参数化Vector的方法。
就像替换掉程序中的new和delete一样,我们也可以将指针转化为资源句柄。在这两种情况下,都将得到更简单也更易维护的代码,而且没什么额外的开销。特别是,我们能实现强资源安全(strong resource safety),换句话说,对于一般概念上的资源,这种方法都可以消除资源泄漏的风险。比如存放内存的vector、存放系统线程的thread和存放文件句柄的fstream。
在很多编程语言中,资源管理任务都主要委托给了垃圾回收器,C++同样提供了一个垃圾回收接口以便程序员插入自己的垃圾回收器。但是,我认为对于资源管理问题垃圾收集是最后的选择,仅当更干净、更通用且局部化更好的替代技术都不可用时才考虑它。我理想中的情况是不制造任何垃圾,从而消除对垃圾回收器的需求:不要产生垃圾! ...
Read now
Unlock full access