mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-03-03 22:00:26 +08:00
item20:update
This commit is contained in:
parent
654bea9d6e
commit
69977af77c
@ -147,10 +147,10 @@ private:
|
||||
|
||||
反之不行。当你的资源由`std::shared_ptr`管理,现在又想修改资源生命周期管理方式是没有办法的。即使引用计数为一,你也不能重新修改资源所有权,改用`std::unique_ptr`管理它。所有权和`std::shared_ptr`指向的资源之前签订的协议是“除非死亡否则永不分离”。不能离婚,不能废除,没有特许。
|
||||
|
||||
`std::shared_ptr`不能处理的另一个东西是数组。和`std::unique_ptr`不同的是,`std::shared_ptr`的API设计之初就是针对单个对象的,没有办法`std::shared_ptr<T[]>`。一次又一次,“聪明”的程序眼踌躇于是否该使用`std::shared_ptr<T>`指向数组,然后传入自定义数组销毁器。(即`delete []`)。这可以通过变异,但是是一个糟糕的注意。一方面,`std::shared_ptr`没有提供`operator[]`重载,所以索引数组需要借助怪异的指针算术。另一方面,`std::shared_ptr`支持指向基类指针的转换,这对于单个对象来说有效,但是当用于数组类型时相当于在类型系统上开洞。(处于这个原因,`std::unique_ptr`禁止这种转换。)。更重要的是,C++11已经提供了很多内置数组的候选方案(比如`std::array`,`std::vector`,`std::string`)。声明一个指向傻瓜数组的智能指针几乎总是标识着糟糕的设计。
|
||||
`std::shared_ptr`不能处理的另一个东西是数组。和`std::unique_ptr`不同的是,`std::shared_ptr`的API设计之初就是针对单个对象的,没有办法`std::shared_ptr<T[]>`。一次又一次,“聪明”的程序员踌躇于是否该使用`std::shared_ptr<T>`指向数组,然后传入自定义数组销毁器。(即`delete []`)。这可以通过编译,但是是一个糟糕的注意。一方面,`std::shared_ptr`没有提供`operator[]`重载,所以索引数组需要借助怪异的指针算术。另一方面,`std::shared_ptr`支持指向基类指针的转换,这对于单个对象来说有效,但是当用于数组类型时相当于在类型系统上开洞。(处于这个原因,`std::unique_ptr`禁止这种转换。)。更重要的是,C++11已经提供了很多内置数组的候选方案(比如`std::array`,`std::vector`,`std::string`)。声明一个指向傻瓜数组的智能指针几乎总是标识着糟糕的设计。
|
||||
|
||||
记住:
|
||||
+ `std::shared_ptr`为任意共享所有权的资源一种自动垃圾会搜的便捷方式
|
||||
+ `std::shared_ptr`为任意共享所有权的资源一种自动垃圾回收的便捷方式
|
||||
+ 较之于`std::unique_ptr`,`std::shared_ptr`对象通常大两倍,控制块会产生开销,需要原子引用计数修改操作
|
||||
+ 默认资源销毁是通过**delete**,但是也支持自定义销毁器。销毁器的类型是什么对于`std::shared_ptr`的类型没有影响
|
||||
+ 避免从原始指针变量上创建`std::shared_ptr`
|
4
4.SmartPointers/item20.md
Normal file
4
4.SmartPointers/item20.md
Normal file
@ -0,0 +1,4 @@
|
||||
## Item 20:像std::shared_ptr一样使用std::weak_ptr可能造成dangle
|
||||
|
||||
|
||||
自相矛盾的是,如果有一个像`std::shared_ptr`的指针但是不参与资源所有权共享的指针是很方便的。换句话说,类似`std::shared_ptr`的指针但是不影响对象的引用计数。这种类型的智能指正
|
@ -35,7 +35,7 @@
|
||||
4. 智能指针
|
||||
1. [Item 18:对于独占资源使用std::unique_ptr](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item18.md) __更新中__
|
||||
2. [Item 19:对于共享资源使用std::shared_ptr](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item19.md)
|
||||
3. Item 20:对于类似于std::shared_ptr的指针使用std::weak_ptr可能造成悬置
|
||||
3. [Item 20:像std::shared_ptr一样使用std::weak_ptr可能造成dangle](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/4.SmartPointers/item20.md) __更新中__
|
||||
4. Item 21:优先考虑使用std::make_unique和std::make_shared而非new
|
||||
5. Item 22:当使用Pimpl惯用法,请在实现文件中定义特殊成员函数
|
||||
5. 右值引用,移动语意,完美转发
|
||||
|
Loading…
Reference in New Issue
Block a user