使用 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_ptr
和 make_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_ptr
、make_shared
和 allocate_shared
添加了对从 C++20 开始的数组的支持。
要分配一个 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_ptr
和 make_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_ptr
、make_shared
和 allocate_shared
添加了对从 C++20 开始的数组的支持。