3

要分配一个 char* 数组,我通常会写如下内容:

char* arr = new char[size];

如何使用 boost::shared_ptr(或者可能是 boost::shared_array)和 boost::make_shared 来实现相同的目标?

我的猜测是:

1) boost::shared_ptr<char[]> arr = boost::make_shared<char[]>(size);

2) boost::shared_ptr<char> arr = boost::make_shared<char>(size);

3) boost::shared_ptr<char> arr = boost::shared_ptr<char>(new char[size]);

最后一个看起来是对的,但是否保证在销毁时会调用 delete [] arr ?

4

2 回答 2

2

正确的是make_shared<T[]>(n).

请记住,在c++20之前,它是标准库中不存在的扩展(尽管unique_ptr<T[]> 标准的一部分)。

Boostshared_ptr确实会为它调用正确的删除器(天真地, delete[])。

于 2017-10-06T22:54:20.203 回答
2

提升 shared_ptr 和 make_shared

shared_ptrBoost 支持使用和进行数组分配和处理make_shared。根据boost的文档:

从 Boost 1.53 版开始,shared_ptr 可用于保存指向动态分配数组的指针。这是通过使用数组类型(T[] 或 T[N])作为模板参数来实现的。使用无大小数组 T[] 和大小数组 T[N] 几乎没有区别;后者只是使 operator[] 能够对索引执行范围检查。

只需使用:

shared_ptr<char[]> arr(new char[size]);
-- OR --
shared_ptr<char[]> arr = make_shared<char[]>(size);

标准库

根据cppreference.com的标准shared_ptrmake_sharedallocate_shared添加了对从 C++20 开始的数组的支持。

于 2017-10-06T23:33:49.953 回答