2016-12-01 16 views
-1

ダブルの配列へのスマートポインタを作成する方法を教えてください。次の命令が動作しませんスマートポインタauto_ptrスマートポインタを配列に使用する

を使用して

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

:私はこの表現を変換したい

スマートポインタを使用して、配列の値を取得する方法も
auto_ptr<double[]> darrp(new double[N]); 

auto_ptrは、配列のための専門が含まれていないとしてあなたは、std::auto_ptrでこれを行うことはできませんおかげ

ヨウネス

+0

が、それは動作しません。何について:ご質問は約C++ 03のですが

*は、これができるように、std::unique_ptr does contain partial specialization for an arrayことは注目に値しますか!あなたは通常どのようにスマートポインタから値を取得しますか? – Lunaweaver

答えて

1

*

auto_ptrがこれを許可していませんが、あなたがのためにstd::tr1::shared_ptrを使用することができますスマートポインタアレイ:

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

になりますが、shared_ptrは配列上のdeletedelete[]ではなく)を誤って呼び出すことになります。これは望ましくないため、カスタムの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[] 
関連する問題