使用 boost::make_shared 分配 char* 数组

Allocate char* array with boost::make_shared

要分配一个 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?

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

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

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

提升 shared_ptr 和 make_shared

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

Starting with Boost release 1.53, shared_ptr can be used to hold a pointer to a dynamically allocated array. This is accomplished by using an array type (T[] or T[N]) as the template parameter. There is almost no difference between using an unsized array, T[], and a sized array, T[N]; the latter just enables operator[] to perform a range check on the index.

只需使用:

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

标准库

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