次の簡単なコードを考えてみましょう。
struct test
{
test(int n):numelements(n){ arr = new int[numelements] }
int numelements;
int* arr;
~test()
{
delete[] arr;
}
}
void foo_ref(test& x,n)
{
// set first n elements of the array x.arr to random numbers
}
void foo_ptr(test* x,n)
{
// set first n elements of the array x->arr to random numbers
}
int main(void)
{
test mystruct(1000000);
foo_ref(mystruct,20);
// foo_ptr(&mystruct,20);
return 0;
}
上記のコードでは、それが参照するオブジェクトに対してまったく同じ操作を実行しますfoo_ref
。。ただし、foo_refはオブジェクトを参照で渡し、foo_ptrはポインターで渡します。foo_ptr
mystruct
どちらの場合も、オブジェクトのデストラクタはどこで呼び出されますか?この質問に対する標準的な答えは常に「オブジェクトのスコープが終了するとき」であることを私は知っています
ただし、参照渡しの場合を考えてみてください。foo_ref
mystructの本体内には、その関数のスコープがあります。では、関数の最後でオブジェクトのデストラクタが呼び出されfoo_ref
ませんか?
たぶん私の混乱は何かの範囲の理解に関係しています。私の推論のどこが間違っているのか教えてください。