std::shared_ptr的用法

7

我该如何使用std::shared_ptr来处理double数组?此外,使用shared_ptr有哪些优缺点。


1
你不应该使用std::shared_ptr来管理动态分配的数组,因为它不能正确调用delete。你可能需要使用std::vector<double> - wkl
1
从技术角度来看,如果共享所有权语义对你很重要,你可以选择std::shared_ptr<std::vector<double>> 或Boost的shared_array。例如,请参见此问题:https://dev59.com/mVnUa4cB1Zd3GeqPbIWb - Stuart Golodetz
3
关于所有权语义的问题,@StuartGolodetz提出了很好的观点。piyush314需要知道shared_array是一个Boost构造(不是标准),如果他真的非常想要一个原始的分配数组,他可以为指针删除器使用std::default_delete<T[]>参数,像这样:std::shared_ptr<double> name(new double[size], std::default_delete<double[]>()); - wkl
确实 - 当你写那个的时候,我正在添加“Boost”的内容 :) - Stuart Golodetz
2个回答

9

这取决于你需要什么。如果你只需要一个可调整大小的双精度数组,请选择

std::vector<double>

例子:

std::vector<double> v;
v.push_back(23.0);
std::cout << v[0];

如果您在意共享该数组的所有权,请使用例如:
std::shared_ptr<std::vector<double>>

例子:

std::shared_ptr<std::vector<double>> v1(new std::vector<double>);
v1->push_back(23.0);
std::shared_ptr<std::vector<double>> v2 = v1;
v2->push_back(9.0);
std::cout << (*v1)[1];

相反,Boost库也有
boost::shared_array

这里有一个类似的东西,也是用于同样的目的。请参见:

http://www.boost.org/libs/smart_ptr/shared_array.htm

至于shared_ptr的一些优缺点:

优点

  • 基于引用计数的自动化共享资源回收——有助于避免内存泄漏和其他与未在应该时进行清理相关的问题
  • 可以更轻松地编写异常安全代码

缺点

  • 存储引用计数的内存开销对于小对象来说可能很大
  • 性能可能比原始指针差(但需要测量)

5

您还可以提供一个 数组删除器:

template class ArrayDeleter {
public:
    void operator () (T* d) const
    { delete [] d; }
};

int main ()
{
    std::shared_ptr array (new double [256], ArrayDeleter ());
}

1
你也可以使用lambda表达式:std::shared_ptr<double> array(new double[256], [](double *d) { delete [] d; } ); - Frerich Raabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接