これは、C++ でヒープ上に変数を作成する方法です。
T *ptr = new T;
ptr は、明らかに、新しい T へのポインターを参照します。私の質問は、これを行うことができます:
T *ptr = new T*;
これは、非常に危険なコードにつながる可能性があるようです。これが可能かどうか/適切に使用する方法を誰かが知っていますか?
これは、C++ でヒープ上に変数を作成する方法です。
T *ptr = new T;
ptr は、明らかに、新しい T へのポインターを参照します。私の質問は、これを行うことができます:
T *ptr = new T*;
これは、非常に危険なコードにつながる可能性があるようです。これが可能かどうか/適切に使用する方法を誰かが知っていますか?
int** ppint = new int*;
*ppint = new int;
delete *ppint;
delete ppint;
new T*
Tへのポインターへのポインターを返します。したがって、宣言は正しくありません。次のようにする必要があります。
T** ptr = new T*;
そして、それはヒープに常駐します。
はい、ポインターへのポインターを宣言できます...そして、はい、ポインターはヒープ上にあります。
このようなものが必要な理由として言及されました。頭に浮かぶのは動的配列です。(実際には、ほとんどのベクター実装でこれが使用されます。)
// Create array of pointers to object
int start = 10;
SomeObject** dynamic = new SomeObject*[start];
// stuff happens and it gets filled
// we need it to be bigger
{
SomeObject** tmp = new SomeObject*[start * 2];
for (size_t x = 0; x < start; ++x)
tmp[x] = dynamic[x];
delete [] dynamic;
dynamic = tmp;
}
// now our dynamic array is twice the size
その結果、オブジェクト自体ではなく、一連のポインターをコピーして配列を増やします。
あなたはできません
T *ptr = new T*;
の戻り値の型new foo
は「foo へのポインター」またはfoo *
.
できるよ
T **ptr = new T*;