要分配一个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]);
最后一个看起来是正确的,但是否可以保证在销毁后将调用删除 [] arr?
正确的是 make_shared<T[]>(n)
.
c++20 之前,它是一个扩展,标准库中不存在(尽管unique_ptr<T[]>
是标准的一部分)。
Boost的shared_ptr
确实会调用正确的删除器(天真地, delete[]
)为它。
提升shared_ptr和make_shared
Boost 支持使用 shared_ptr
和 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_ptr
,make_shared
和allocate_shared
增加了对从C++20开始的数组的支持。