2

割り当てられた構造体'オブジェクト'の参照カウントの基本は、私には非常に簡単に思えます。新しいオブジェクトに1のRCを与えます。割り当て時に、古いオブジェクトのRCをデクリメントし(RC = 0の場合は解放)、割り当てられたオブジェクトのRCをインクリメントします。スコープを離れるすべてのオブジェクトのRCをデクリメントします。

ただし、RCされたオブジェクトが関数に渡されたり、関数から返されたりするときに何をする必要があるのか​​、少し戸惑っています。各関数呼び出しの前後にRCをinc/decする必要がありますか?必要に応じてincとdecをどこに配置する必要がありますか(関数内の開始と終了、または関数呼び出しの前後ですか?)?関数によって返されるRCされたオブジェクトはどうですか?

4

3 に答える 3

3

参照カウントを増やすことは、「ポイントが何を指しているのか興味があるので、どこかにポインタを格納しました。見ないうちに解放しないでください」と言っているようなものです。

そのため、ポインタを保存するたびに「参照」であり、カウントする必要があります。

関数がポインタをどこかに格納しない場合は、ポインタをインクリメントする必要はありません。ポインタを保存する場合は、使用が終了したら、参照カウントをデクリメントします。\

多くの場合、「オブジェクト」は、参照カウントがすでに1に設定された状態で返されます。その関数のドキュメントを読んで、参照の「所有権を渡した」かどうかを確認する必要があります(この場合、デクリメントする必要があります)。カウント)、または呼び出す必要のある他の関数がある場合は、それをデクリメントし、他のオブジェクトの内部にあるそのポインターへの参照を削除します。

于 2013-01-05T13:42:13.820 に答える
3

一般的に、新しい参照が作成されるたびにインクリメントし、参照が破棄/破棄されるたびにデクリメントします。

関数の引数にはコピーが必要なので、それは増分です。関数の戻り値にはコピーが必要なので、それは増分です。もちろん、多くの場合、対応する同時破棄も行われるため、カウントを変更しないことで最適化できる可能性があります。

もちろん、Cでは、すべてを手動で行う必要があるため、これは非常に複雑になり、エラーが発生しやすくなります。壊れた/信頼できない参照カウントメカニズムは、まったくないよりも間違いなく悪いです。

于 2013-01-05T13:42:20.940 に答える
0

機能は同じだと思います。
関数呼び出しへのポインターを渡した場合、それを割り当てとして扱いませんか?(RCをインクリメントする必要があると思います)
関数を終了するときは、スコープを終了するのと同じだと思います。
戻り値については、割り当てに使用する場合は、おっしゃるように、RC+1またはRCを変更する必要はありません。

于 2013-01-05T13:50:07.573 に答える