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[]