【问题标题】:Usage of std::shared_ptrstd::shared_ptr 的使用
【发布时间】:2012-03-26 16:50:02
【问题描述】:

如何将 std::shared_ptr 用于双精度数组?此外,使用 shared_ptr 的优点/缺点是什么。

【问题讨论】:

  • 您不要将std::shared_ptr 用于动态分配的数组,它不会调用正确的delete。你可能想要std::vector<double>
  • @birryree:从技术上讲,如果共享所有权语义对您很重要,您可以选择 std::shared_ptr<:vector>>。或者 Boost 的 shared_array。例如看这个问题:stackoverflow.com/questions/6796655/…
  • @StuartGolodetz - 关于所有权语义的要点。 piyush314 必须知道 shared_array 是一个 Boost 构造(非标准),如果他真的非常想要一个原始分配的数组,他可以为指针删除器使用 std::default_delete&lt;T[]&gt; 参数,如下所示:std::shared_ptr&lt;double&gt; name(new double[size], std::default_delete&lt;double[]&gt;());
  • 确实——我只是在你写的时候添加了“Boost”:)

标签: c++ shared-ptr


【解决方案1】:

这取决于你追求什么。如果您只想要一个可调整大小的双精度数组,请使用

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 go 的一些优点/缺点而言:

优点

  • 基于引用计数的自动共享资源解除分配 - 有助于避免内存泄漏和其他与本应解除分配的事物相关的问题
  • 可以更轻松地编写异常安全代码

缺点

  • 存储引用计数的内存开销对于小对象可能很重要
  • 性能可能比原始指针差(但要衡量一下)

【讨论】:

    【解决方案2】:

    您也可以提供array deleter:

    template class ArrayDeleter {
    public:
        void operator () (T* d) const
        { delete [] d; }
    };
    
    int main ()
    {
        std::shared_ptr array (new double [256], ArrayDeleter ());
    }
    

    【讨论】:

    • 你也可以只使用 lambda,我认为:std::shared_ptr&lt;double&gt; array(new double[256], [](double *d) { delete [] d; } );
    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2011-08-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多