2

たとえば、プロトタイプがあるとします。

QList<Foo *> *methodBar(int someParam);

このメソッドは、クライアント コードへの QList ポインターを返します。クライアント コードは、返されたポインターを破棄する必要があるかどうかをどのように認識しますか?

ポインターが与えられた場合、そのメモリを制御するのはあなたの仕事であるという規則はありますか? それともその逆?

これを解決するための私の考えは次のとおりです。

オプション 1: doc ブロックで、クライアント コードが QList の処理が完了したらそれを削除する必要があることを文書化します。

オプション 2 署名を次のように変更します。

void methodBar(int someParam, QList<Foo *> &listForOutput);

クライアントコードがリストを作成し、終了時にリストを破棄する必要があることを確実に認識できるようにします。

オプション 3 ある種のスマート ポインターを使用します。これが機能するかどうかはわかりませんが、 a を aQList*内にラップしQPointerて のコピーを返した場合QPointer、内部を浅いコピーし、クライアント コードで が範囲外になったQList*ときに想定しますQPointerとともに破壊されQList*ます。

では、これらのオプション (または、おそらく他のオプション) のうち、C++ の世界で最も一般的なものはどれでしょうか。これを行う標準的な方法がない場合は、個人的な好みによるという回答を受け入れます。

4

1 に答える 1

4

呼び出し元にポインターの責任があることを知らせたい場合は、次のようにします。

std::unique_ptr<QList<Foo *>> methodBar(int someParam);

もう 1 つの利点は、メモリが自動的に解放されないようにするために、呼び出し元が手間をかけなければならないことです。

Astd::unique_ptrはコピーできず、移動するだけなので、std::unique_ptrかなり明示的に a を渡すと、メモリを解放する責任が呼び出し先から呼び出し元に移されます。

これは、リスト内で指されているオブジェクトが呼び出し元の責任ではないことも意味することに注意してください。これらのオブジェクトも呼び出し元の責任にしたい場合は、次を使用します。

std::unique_ptr<QList<std::unique_ptr<Foo>>> methodBar(int someParam);
于 2013-06-09T18:45:52.763 に答える