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

时间:2017-10-06 21:47:13

标签: c++ boost shared-ptr smart-pointers 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]);

最后一个看起来正确,但是保证在销毁时会删除[] arr吗?

2 个答案:

答案 0 :(得分:2)

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

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

Boost&#39; shared_ptr确实会调用正确的删除者(天真地, delete[])为此。

答案 1 :(得分:2)

提升shared_ptr和make_shared

Boost使用shared_ptrmake_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开始的数组的支持。