2

次のコードがあるとします。

void Allocate(int *p)
{
    p = new int;
    *p++ = 2;
}

int main()
{
    int i = 10;
    Allocate(&i);
    std::cout << i << std::endl;
}

私は次の意味について少し自信があります:

*p++ = 2;

出力は10であり、なぜこれが事実であるかについての私の推論は、それ*p++は一時的なものであるため、それへの割り当ては のスコープの最後で失われAllocate(int *p)ます。

これは事実ですか?よろしくお願いします!

4

5 に答える 5

4
  • への入力では、関数内の変数Allocatep指し ます。imain
  • この変数のアドレスは失われ、 new int.
  • この int の値 (初期化されていないため、何からでも開始できます) は 2 に設定されます。
  • pポインタがインクリメントされます。
  • 関数はこのAllocate時点で戻り、割り当てられた int をリークします。
  • 関数i内のの値は変更されていないため、変更されていません。mainAllocate
于 2013-05-31T03:25:42.433 に答える
3

i のアドレスを Allocate に渡すと、i のアドレスを指す別の (一時) ポインターが作成されます (つまり、ポインターによる受け渡し)。次に、その一時ポインターは新しい場所を指します (新しい int を介して)。したがって、i の値はそのままです。

これは私が描いたくだらないイラストです

于 2013-05-31T03:25:50.990 に答える
3
p = new int;

p以前に指していたものではなく、指す新しいメモリを割り当てています。次に、この新しく割り当てられたメモリを変更すると、関数が終了すると永久に失われ、メモリ リークが発生します。割り当て行を削除すると、出力が 2 になるはずです。この場合、++ は何もしません。ポインタをインクリメントし、逆参照する古い値を返すだけです。

于 2013-05-31T03:23:21.087 に答える
2

を入力するとすぐに、メモリの新しいブロックを指すようAllocateに割り当てるpため、もはや を指しませんii次に、ポイント先のメモリ セルを設定する前にそのポインタを移動したため、その新しいメモリ ブロック (メソッドが戻るときにリークされます) を変更しても影響はありません。

于 2013-05-31T03:24:48.287 に答える