関数呼び出しの宣言に、参照によって渡されたメモリが関数から戻ったときに無効と見なされ、呼び出し元がその後に使用しようとするとエラーが発生することを示す方法があります。関数呼び出しが返されます。
ここでいくつか混乱していると思います。
1つは、メモリのブロブを関数に渡すのではなく、オブジェクト(タイプrectangle
)に渡すことです。オブジェクトは単なるメモリの塊ではありません。
オブジェクトはコンストラクターを実行し、メモリのブロブをオブジェクトに変換し、オブジェクトをある決定的な状態にセットアップしました。オブジェクトが死ぬと、そのデストラクタが実行され、オブジェクトが再びメモリのブロブに変わります。これら2つの間に、それはオブジェクトです。
オブジェクトを無効にするには、オブジェクトの状態の一部である1つ以上のフラグを設定し、無効化を通知するか(IOストリームがそれを行います)、またはそのデストラクタを呼び出す必要があります。これは(通常)間接的にのみ行う必要があります。にdelete
new
を使用して、または暗黙的にスコープから外れるようにして作成されたingおよびオブジェクト(自動オブジェクトの場合)。
これにより、渡されたオブジェクトを変更する関数が残ります。
関数は、そのシグネチャによって引数を変更する可能性を示します。オブジェクトが関数にどのように渡されるかを見ると、関数が引数を変更する可能性があるかどうかがわかります。関数を呼び出す必要があり、何らかの理由で変更されてはならないオブジェクトを、関数が変更される可能性があることを示す引数として渡す必要がある場合は、そのオブジェクトのコピーを渡す必要があります。実物。
ここで触れていない何らかの理由でオブジェクトが関数の引数として使用された後にオブジェクトが使用されないようにしたい場合は、オブジェクトを小さな囲みスコープに入れるだけです。
void f()
{
g();
{
rectangle rect(...);
h(r);
} // rect dies here
// rect not accessible here
g();
}