【问题标题】:Using smart pointers for array对数组使用智能指针
【发布时间】:2016-12-01 16:24:38
【问题描述】:

如何创建指向双精度数组的智能指针。我想转换这个表达式:

double* darr = new double[N]; // Notice the square brackets

使用智能指针auto_ptr

以下指令不起作用:

auto_ptr<double[]> darrp(new double[N]);

还有如何使用智能指针获取数组的值。

谢谢

尤内斯

【问题讨论】:

  • 它不起作用怎么办?您通常如何从智能指针中获取值?

标签: arrays smart-pointers c++03


【解决方案1】:

std::auto_ptr 不能这样做,因为auto_ptr 不包含数组的特化*

虽然auto_ptr 不允许这样做,但您可以将std::tr1::shared_ptr 用于智能指针数组:

#include <tr1/memory>
std::tr1::shared_ptr<double[]> d(new double[10]);

This will compile,但 shared_ptr 会在您的阵列上错误地调用 delete(而不是 delete[]),这是不可取的,因此您需要提供自定义删除器。

The answer 这里提供了您需要的代码(逐字复制),尽管答案是针对 C++11:

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

std::shared_ptr<int> sp( new int[10], array_deleter<int>() );

这对你来说,意味着你需要:

std::tr1::shared_ptr<double> d( new double[10], array_deleter<double>() );

要访问智能指针数组中的元素,您首先需要使用get() to dereference the smart pointer to obtain the raw pointer

std::tr1::shared_ptr<double> d( new double[10], array_deleter<double>() );
for (size_t n = 0; n < 10; ++n)
{
    d.get()[n] = 0.2 * n;
    std::cout << d.get()[n] << std::endl;
}

* 虽然您的问题是关于 C++03,但值得注意的是 std::unique_ptr does contain partial specialization for an array,允许这样做:

std::unique_ptr<double[]> d(new double[10]); // this will correctly call delete[]

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多