要分配一个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吗?
答案 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_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开始的数组的支持。