他の答えは良いアドバイスです。しかしまた、関数を制御していて、ポインターが指すオブジェクトbar
に変更できるようにする必要がある場合(これがおそらく最初に二重ポインターを持っている理由です)、最もクリーンなアプローチはには次の署名を使用します。bar
mystruct *
bar
void bar(unsigned int val, mystruct * &foo);
ポインターを参照渡しするため、コードの可読性を犠牲にすることなく、ポインターが指すオブジェクトに変更できます。たとえば、次のようになります。
int main()
{
mystruct * foo = new mystruct;
bar(42, foo);
}
void bar(unsigned int val, mystruct * &foo)
{
foo->member1 = val;
foo = new mystruct;
}
メモリ リークのない完全な使用シナリオは次のようになります。
int main()
{
// allocate dynamically a mystruct whose member1 is equal to 1.
mystruct * foo1 = new mystruct;
mystruct * foo2 = foo1;
foo1->member1 = 1;
// pass by reference foo1
bar(42, foo1);
// here, foo1->member1 == 42 and foo2->member1 == 10
// free memory
delete foo1; // the one allocated in bar()
delete foo2; // the one allocated in main()
}
void bar(unsigned int val, mystruct * &foo)
{
// modify the object allocated in main()
foo->member1 = 10;
// allocate dynamically a mystruct, store its address in foo
foo = new mystruct;
foo->member1 = val;
}