August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
本书到目前为止的例子都是关心定义在作用域内的对象,它们可以在作用域结束的时候释放掉资源,但如果对象是在自由存储上分配的呢?在<memory>当中,标准库提供了两种“智能指针”来管理自由存储上的对象:
·unique_ptr表示唯一所有权。
·shared_ptr表示共享所有权。
这些“智能指针”最基本的作用是防止由于编程疏忽而造成内存泄漏。例如:
在这段代码中,如果i<99或者j<77,则我们“忘了”释放掉指针p。另一方面,unique_ptr确保不论以哪种方式(通过抛出异常,或者通过执行return语句,或者“直达函数末尾”)退出f()都会释放掉它的对象。其实换个角度考虑一下,如果干脆不使用指针也不使用new,就能简单地解决这个问题:
不幸的是,滥用new(以及指针和引用)看起来正在成为一个日益严重的问题。
但是,当你确实需要指针的语义时,那么与内置指针相比,unique_ptr是更好的选择,后者是一种非常轻量级的机制,消耗的时空代价并不比前者大。通过使用unique_ptr,还可以把自由存储上申请的对象传递给函数或者从函数中传出来:
unique_ptr是一个独立的对象(或数组)的句柄,就像vector是对象序列的句柄一样。这二者都以RAII的机制控制其他对象的生命周期,并且都依赖移动语义使得return语句简单高效。 ...
Read now
Unlock full access