2

2 つの方法を使用して新しいポインターを作成しようとしていますが、意味は同じですか?

int* ptn;
int* ptn(nullptr);
4

4 に答える 4

10

2 つの方法を使用して新しいポインターを作成しようとしていますが、意味は同じですか?

いいえ、そうではありません。少なくとも、常にではありません。

これらの変数がブロック スコープで宣言されている場合、最初の変数は初期化されていないポインターを与えるだけで、2 番目の変数はポインターを null ポインター値に初期化します。したがって、最初のケースでは:

int main()
{
    int* ptn; // This gives you an uninitialized pointer...
    if (ptn == nullptr) // ...so this is UNDEFINED BEHAVIOR!
    {
        // ...
    }
}

ptnとにかくの値を何らかの値に初期化する前に使用すると、undefined behaviorにヒットします。

一方、名前空間スコープにある場合、2 つの宣言は同等です。これは、ptrstatic storage durationがあり、とにかくゼロで初期化されるためです。

int* ptn; // This pointer has static storage duration, will be zero-initialized...
int main()
{
    if (ptn == nullptr) // ...so no undefined behavior here!
    {
        // This will be entered...
    }
}

C++11 標準のパラグラフ 8.5/10 によると:

[ 注: 静的ストレージ期間のすべてのオブジェクトは、プログラムの起動時に、他の初期化が行われる前にゼロで初期化されます。場合によっては、後で追加の初期化が行われます。—終わりのメモ]

于 2013-05-20T18:40:51.840 に答える
0

int *ptn; 何も指していない、またはガベージを指しているポインターです。int *ptn(nullptr); コンパイル時に null 値に初期化されています。

于 2013-05-20T18:42:43.197 に答える