【问题标题】:Allocate char* array with boost::make_shared使用 boost::make_shared 分配 char* 数组
【发布时间】:2018-03-18 18:27:54
【问题描述】:

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

【问题讨论】:

  • 您的问题是关于分配“char* 数组”,但您真正想要的是 char 数组。你真的想要一个指针数组吗? (一旦你意识到,3 显然是错误的。它会创建一个智能指针,其类型表示它指向 char,而不是任何东西的数组。
  • 所以正确的是 1) ?我认为 3 由于 new char[size] 声明了一个指向数组的指针。换句话说,我希望它是指向数组第一个字符的指针,后跟 size-1 字符。
  • 但是你想要的是一个指向数组的智能指针,它指向数组中的第一个字符。您不想要一个指向恰好指向数组中第一个字符的字符的智能指针。所以 type 是错误的,即使它指向正确的东西。
  • 好吧 1) 是正确的吗?而当对象被破坏时,delete[] arr 会被调用 not delete arr 对吧?
  • 支持记录在here。不能保证会专门使用delete[](如果您考虑一下,那将是低效的,因为您需要一个单独的对象来保存返回的值),但是这些对象将被正确破坏并释放内存。

标签: c++ boost shared-ptr smart-pointers make-shared


【解决方案1】:

正确的是make_shared&lt;T[]&gt;(n)。

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

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

【讨论】:

  • 稍微更正了 sehe 的陈述,make_shared() 特化在 '11 和 '14 标准中被忽略和省略,但已添加到 '17 标准中。
  • @jschmerge 感谢您的加入。我在答案中添加了更正 :) (可能何时添加的详细信息尚未正式发布)
【解决方案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开始增加了对数组的支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多