什么是未知大小的make_shared?

时间:2017-01-18 13:19:26

标签: c++ arrays boost shared-ptr make-shared

this回答T.C.状态

  

boost::make_shared等支持数组类型 - 其中一个未知   尺寸,或固定尺寸

boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(30);
boost::shared_ptr<int[30]> sh_arr3 = boost::make_shared<int[30]>();

首先,make_shared如何支持未知大小的数组类型?我认为数组大小是必需的。

第二,sh_arr2和sh_arr3有什么区别?两者似乎都在创建一个int size 30的数组。

2 个答案:

答案 0 :(得分:2)

这个例子并不是很好。通过一个未知大小的数组,他们可能意味着它可以通过以下方式调用:

int arr2_size = 30;
boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(arr2_size);

由于arr2_size可以动态定义,因此可以将其视为未知&#39;。

其次,他们都创建了一个大小为30的数组,但sh_arr3包含类型本身的大小,如果访问超出边界,编译器将允许编译器发出警告。没有明确大小的类型将无法检测到这些情况。

答案 1 :(得分:1)

  

首先,make_shared如何支持未知大小的数组类型?一世   会认为数组大小是必需的。

Boost使用辅助类来确定其<div> <span class="red">TEXT 1</span> <span class="blue">TEXT 2 <span>HELLO WORLD APP</span></span> <span class="yellow">TEXT 3</span> </div>的返回类型。它还使用另一个辅助类shared_ptr::operator[](...),它为数组类型提供了特殊化来确定边界(如果boost::detail::sp_extent可以分解为T),这是一个摘要的片段来自http://www.boost.org/doc/libs/1_63_0/boost/smart_ptr/shared_ptr.hpp

T[]
  

第二,sh_arr2和sh_arr3有什么区别?两个似乎   创建一个int size 30的数组。

第二个包括范围检查。来自Boost docs

  

从Boost版本1.53开始,shared_ptr可用于保存   指向动态分配的数组的指针。这是通过   使用数组类型(T []或T [N])作为模板参数。有   使用未大小的数组,T []和大小的几乎没有区别   数组,T [N];后者只是让operator []执行一个范围   检查索引。