将智能指针用于数组



如何创建一个智能指针,指向双重数组。我想转换此表达式:

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

使用智能指针auto_ptr

以下指令无效:

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

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

谢谢

younès

您无法使用std::auto_ptr执行此操作,因为auto_ptr不包含数组的专业化*

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

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

这将进行编译,但是shared_ptr会在数组上错误地调用delete(而不是delete[]),这是不受欢迎的,因此您需要提供自定义的DELERER。

这里的答案提供了您需要的代码(逐字复制),尽管答案是针对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()来取消智能指针以获取原始指针:

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 :: simolor_ptr确实包含了一个数组的局部专业化,允许以下内容:

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

相关内容

  • 没有找到相关文章

最新更新