2016-04-20 3 views
9

スマートポインタでスカラーとアレイの両方を使用するにはどうすればよいですか?スマートポインタでスカラーと配列の両方を使用する

新しいを使用しての古い方法とポインタを削除します。私は減らすことができますどのように

std::unique_ptr<int> p1(new int); 
std::unique_ptr<int[]> p2(new int[10]); 

:スマートポインタで

int *p; 

if (useScalar) { 
    p = new int; 
} else { 
    p = new int[10]; 
} 

if (useScalar) { 
    delete p; 
} else { 
    delete[] p; 
} 

、私は各スカラと配列ポインタのための2つのポインタを使用する必要がありますスマートポインタは1つだけ使用しますか?

+0

'delete'や' delete [] 'を使うかどうかを判断するための' bool useScalar'を格納した独自のスマートポインタを書くことができます。 – jotik

+6

'p = new int [1]'を割り当てて、それがスカラーへのポインタであるとふりかけることができますか? – dasblinkenlight

+2

'int [1]'をスカラーとして使うこともできます。プログラムの他の部分も簡略化しているかもしれません。 – alain

答えて

5

カスタムデリターを使用する場合は、いずれのポインターにも同じタイプを使用できます。

std::unique_ptr<int, void(*)(int*)> p = {nullptr, [](int*){}}; 
if (useScalar) { 
    p = { 
     new int, 
     [](int* p){delete p;} 
    }; 
} else { 
    p = { 
     new int[10], 
     [](int* p){delete[] p;}, 
    }; 
} 
関連する問題