Вы не можете сделать это с 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[]
Что о нем не работает? Как вы обычно получаете значения из умного указателя? – Lunaweaver