如何创建一个智能指针,指向双重数组。我想转换此表达式:
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[]