2016-12-01 4 views
-1

Как создать интеллектуальный указатель на массив double. Я хочу, чтобы преобразовать это выражение:Использование интеллектуальных указателей для массива

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

с помощью смарт-указатель auto_ptr

следующая инструкция не работает:

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

Кроме того, как получить значения массива с помощью смарт-указатель ,

Благодаря

Юнес

+0

Что о нем не работает? Как вы обычно получаете значения из умного указателя? – Lunaweaver

ответ

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[] 
Смежные вопросы