Revision: with c++17, shared_ptr supports T[] (#195)

Signed-off-by: MER <mer.xuanyi@gmail.com>
This commit is contained in:
Mer 2024-08-19 14:52:46 +08:00 committed by GitHub
parent 8bc0371709
commit 6ddd759973
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -150,7 +150,7 @@ 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<T[]>` API禁止这种转换。更重要的是C++11已经提供了很多内置数组的候选方案比如`std::array``std::vector``std::string`)。声明一个指向傻瓜数组的智能指针(译注:也是”聪明的指针“之意)几乎总是表示着糟糕的设计。
`std::shared_ptr`不能处理的另一个东西是数组。和`std::unique_ptr`不同的是,`std::shared_ptr`的API设计之初就是针对单个对象的没有办法`std::shared_ptr<T[]>`。(译者注: 自 C++17 起 std::shared_ptr 可以用于管理动态分配的数组,使用 std::shared_ptr<T[]>一次又一次,“聪明”的程序员踌躇于是否该使用`std::shared_ptr<T>`指向数组,然后传入自定义删除器来删除数组(即`delete []`)。这可以通过编译,但是是一个糟糕的主意。一方面,`std::shared_ptr`没有提供`operator[]`,所以数组索引操作需要借助怪异的指针算术。另一方面,`std::shared_ptr`支持转换为指向基类的指针,这对于单个对象来说有效,但是当用于数组类型时相当于在类型系统上开洞。(出于这个原因,`std::unique_ptr<T[]>` API禁止这种转换。更重要的是C++11已经提供了很多内置数组的候选方案比如`std::array``std::vector``std::string`)。声明一个指向傻瓜数组的智能指针(译注:也是”聪明的指针“之意)几乎总是表示着糟糕的设计。
**请记住:**