2016-12-01 2 views
-1

어떻게 double 배열에 스마트 포인터를 만들 수 있습니까? 다음 명령이 작동하지 않는 스마트 포인터 auto_ptr배열에 스마트 포인터 사용

를 사용

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

: 나는이 표현을 변환 할

스마트 포인터를 사용하여 배열의 값을 얻을 수있는 방법 또한
auto_ptr<double[]> darrp(new double[N]); 

.

감사

유네스

+0

가 작동하지 않는 무엇에 대해 : 귀하의 질문에 대한 C++ 03이지만

*, 그것은이 허용 std::unique_ptr does contain partial specialization for an array 있음을 주목할 필요가? 대개 어떻게 스마트 포인터에서 값을 가져 옵니까? – Lunaweaver

답변

1

auto_ptrauto_ptr 비록

이 허용하지 않는 배열 *에 대한 전문화를 포함하지 않는 한 당신은 std::auto_ptr이 작업을 수행 할 수없는, 당신을 위해 std::tr1::shared_ptr을 사용할 수 있습니다 스마트 포인터 어레이 :

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

이지만 shared_ptr은 배열에서 바람직하지 않은 delete (delete[] 대신)을 잘못 호출하므로 사용자 정의 deleter를 제공해야합니다. 답가 있지만 여기

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; 
} 
std::unique_ptr<double[]> d(new double[10]); // this will correctly call delete[]