3行目で何をしますか?
のドキュメントを参照してくださいa_function
。通常のルールでは、関数は、所有権や存続期間について、そう言わない限り何もしません。このようなドキュメントの必要性は、スマートポインタが利用できないCAPIを参照することでかなり明確に確立されています。
したがって、パラメータを削除するとは言わない場合は、削除しません。戻ったときを超えて、他の指定された時間まで、パラメータのコピーを保持するとは言わない場合は、そうではありません。
それがあなたがそれに応じて行動する何かを言っている場合、そしてそれが何も言っていない場合あなたdelete b
(またはできれば代わりに書くB b; a_function(&b);
-オブジェクトを破壊しないことによって、関数はあなたがオブジェクトを作成する方法を気にする必要がないことを観察してください、あなたは自由に決定する)。
うまくいけば、明示的に何を言っているのかがわかりますが、運が悪ければ、APIの特定の種類の関数が、パラメーターによって参照されるオブジェクトの所有権を取得するという規則があります。たとえば、それが呼び出された場合set_global_B_instance
、そのポインタが保持されているのではないかという疑いがあり、設定後すぐに削除するのは賢明ではありません。
どちらの方法でも何も言わないが、コードにバグがあり、最終的にその引数がa_function
呼び出されていることに気付いた場合は、ドキュメント化されたdelete
人を見つけて、ドキュメントa_function
にバグを送信します。
多くの場合、その人は自分自身であることが判明します。その場合は、オブジェクトの所有権を文書化するというレッスンを学んでみてください。
スマートポインターは、コーディングエラーを回避するのに役立つだけでなく、所有権の懸念がある場合にポインターを受け入れるか返す関数に対して、ある程度の自己文書化を提供します。自己文書化がない場合は、実際の文書化があります。たとえばauto_ptr
、生のポインタの代わりに関数が返される場合、ポインタdelete
で呼び出す必要があることを通知します。あなたはあなたのauto_ptr
ためにそれをさせることができます、あるいはあなたはそれを他のスマートポインタに割り当てることができます、あるいはあなたはそれをrelease()
あなた自身でポインタと管理することができます。呼び出した関数は気にせず、何も文書化する必要はありません。関数が生のポインターを返す場合、推測する方法がないため、ポインターによって参照されるオブジェクトの存続期間について何かを通知する必要があります。