2

このコードを考えてみましょう。

int *a, *b;
a = foo();
if (a)
   b = a;
a = bar();

問題は、aを呼び出して更新するとbar()bも更新されることです。ただし、を使用してバックアップを作成したいb = a。では、何が問題なのでしょうか。

4

4 に答える 4

1
int *a, *b;
b = new int;

a = foo();
if (a)
   *b = *a;
a = bar();
...
delete(b);

(アドレスaの値はアドレスbの値に割り当てられます。)

あなたが今していることは、aとbがメモリ内の同じ場所を指すようにすることです。次に、aまたはbの値が更新されると、それらのポインターは両方とも新しい値を指します。

ちなみに、bar()ポインタを返さない限り、おそらくとが必要*a = foo()です*a = bar()

于 2012-04-11T18:39:14.703 に答える
1

次の値をバックアップすることができます。

int *a, b;
a = foo();
if (a)
   b = *a;
a = bar();

bまたは、ポインタとして保持したい場合:

...
   *b = *a;
...
于 2012-04-11T18:39:19.237 に答える
0

a == bの場合、bar()はaの値を変更し、新しいaを割り当てません。これは、メモリに関して最も理にかなっています。気になるのがアドレスではなく実際の整数である場合は、b=aを割り当てる代わりに*b=*aを割り当てます。

于 2012-04-11T18:41:40.520 に答える
0

...

int *a;
// ...
a = foo();

...関数がとして宣言されている場合はコンパイルすらできないint foo();ので、として宣言されていると仮定しますint* foo();。同上int* bar();

このような生のポインタを返さないでください。発信者がそれを行うべきかどうかが明確でない場合がdeleteあります。優れたドキュメントはこの問題を部分的にしか解決できません(人間は時々ドキュメントを無視する傾向があります)。整数値をコピーするだけでなく、本当に共有する必要がある場合に備えて、少なくとも整数への参照を返すのはなぜですか?

そうは言っても、あなたの特定のケースではfoo()bar()明らかに同じint "object"を内部で使用しているので、変更した後もa同じオブジェクトを指し続けます。bbar()

于 2012-04-11T18:48:56.217 に答える