このコードを考えてみましょう。
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
同じオブジェクトを指し続けます。b
bar()