2 つの方法を使用して新しいポインターを作成しようとしていますが、意味は同じですか?
int* ptn;
int* ptn(nullptr);
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 つの宣言は同等です。これは、ptr
static 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 によると:
[ 注: 静的ストレージ期間のすべてのオブジェクトは、プログラムの起動時に、他の初期化が行われる前にゼロで初期化されます。場合によっては、後で追加の初期化が行われます。—終わりのメモ]
int *ptn; 何も指していない、またはガベージを指しているポインターです。int *ptn(nullptr); コンパイル時に null 値に初期化されています。