このコードを考えてみましょう。
int *a, *b;
a = foo();
if (a)
b = a;
a = bar();
問題は、aを呼び出して更新するとbar()、bも更新されることです。ただし、を使用してバックアップを作成したいb = a。では、何が問題なのでしょうか。
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()。
次の値をバックアップすることができます。
int *a, b;
a = foo();
if (a)
b = *a;
a = bar();
bまたは、ポインタとして保持したい場合:
...
*b = *a;
...
a == bの場合、bar()はaの値を変更し、新しいaを割り当てません。これは、メモリに関して最も理にかなっています。気になるのがアドレスではなく実際の整数である場合は、b=aを割り当てる代わりに*b=*aを割り当てます。
...
int *a;
// ...
a = foo();
...関数がとして宣言されている場合はコンパイルすらできないint foo();ので、として宣言されていると仮定しますint* foo();。同上int* bar();。
このような生のポインタを返さないでください。発信者がそれを行うべきかどうかが明確でない場合がdeleteあります。優れたドキュメントはこの問題を部分的にしか解決できません(人間は時々ドキュメントを無視する傾向があります)。整数値をコピーするだけでなく、本当に共有する必要がある場合に備えて、少なくとも整数への参照を返すのはなぜですか?
そうは言っても、あなたの特定のケースではfoo()、bar()明らかに同じint "object"を内部で使用しているので、変更した後もa同じオブジェクトを指し続けます。bbar()