This commit is contained in:
kelthuzadx 2020-11-25 11:15:41 +08:00 committed by GitHub
parent b857bef0f8
commit 4ecd7cff3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -150,7 +150,7 @@ private:
`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`。
+ 避免从原始指针变量上创建`std::shared_ptr`。