12

これは、C++ でヒープ上に変数を作成する方法です。

T *ptr = new T;

ptr は、明らかに、新しい T へのポインターを参照します。私の質問は、これを行うことができます:

T *ptr = new T*;

これは、非常に危険なコードにつながる可能性があるようです。これが可能かどうか/適切に使用する方法を誰かが知っていますか?

4

5 に答える 5

37
int** ppint = new int*;
*ppint = new int;

delete *ppint;
delete ppint;
于 2009-08-13T20:39:30.413 に答える
7

new T*Tへのポインターへのポインターを返します。したがって、宣言は正しくありません。次のようにする必要があります。

T** ptr = new T*;

そして、それはヒープに常駐します。

于 2009-08-13T20:41:01.300 に答える
4

はい、ポインターへのポインターを宣言できます...そして、はい、ポインターはヒープ上にあります。

于 2009-08-13T20:39:57.090 に答える
4

このようなものが必要な理由として言及されました。頭に浮かぶのは動的配列です。(実際には、ほとんどのベクター実装でこれが使用されます。)

// 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

その結果、オブジェクト自体ではなく、一連のポインターをコピーして配列を増やします。

于 2009-08-18T04:43:09.050 に答える
2

あなたはできません

T *ptr = new T*;

の戻り値の型new fooは「foo へのポインター」またはfoo *.

できるよ

T **ptr = new T*;
于 2009-08-13T20:41:54.650 に答える