15

我很难在 TR1 文档中找到有关共享数组的参考资料。Boost 文档非常清楚 C++“new”和“new[]”表达式之间存在显着差异。shared_ptr 模板旨在正确保存指向使用“new”创建的动态分配对象的指针。shared_array 模板旨在使用“new[]”正确保存指向动态分配数组的指针。

我正在更新一些代码以使用 TR1 shared_ptr 模板和相关函数,但我发现没有提到 shared_array。TR1 shared_ptr 实现是否区分“new”和“new[]”,并正确销毁这些指针?据我从 TR1 规范中可以看出,它似乎没有。如果是这种情况,我是否仍应将 boost shared_array 模板用于“new[]”样式分配?

4

2 回答 2

23

没错,TR1 中没有 shared_array。

但是,如果您希望使用此构造函数,可以提供自己的删除器对象来执行“删除 []”:

template<class Other, class D>
   shared_ptr(Other* ptr, D dtor);

例如:

template<typename T>
struct my_array_deleter
{
   void operator()(T* p)
   {
      delete [] p;
   }
};

shared_ptr<int> sp(new int[100], my_array_deleter<int>());
于 2009-03-09T19:31:21.237 回答
1

我怀疑大多数使用 TR1 的人不使用数组,而是使用 vector<> 代替。

没看过TR1,所以我就在Boost的基础上回答,大概够用了。boost::shared_ptr<> 处理单个对象,而不是数组。这就是 boost::shared_array<> 的用途。

如果您正在使用数组,并且有理由转换为 shared_array<> 而不是 vector<>,请使用 shared_array<>。

于 2009-03-09T19:32:21.547 回答