1

C++ で、匿名オブジェクトを引数として名前付きオブジェクト メソッドに渡す場合、名前付きオブジェクトを削除すると、匿名オブジェクトは削除されますか?

私がプロジェクトに使用しているライブラリは、独自のオブジェクトのメソッドのほとんどでオブジェクトへのポインタを期待しています。

WContainerWidget::addWidget(WContainerWidget* widget) {/*...*/}

そして彼らの例では、これらのオブジェクトを構築するときに new 演算子をよく使用します。

WContainerWidget* aFoo = new WConainerWidget(/*args*/);
aFoo->addWidget(new WText(/*args*/));

Idelete aFooの場合、匿名WText()オブジェクトは削除されますか?

それらの実装がソースコードをソートせずにこれらの削除を処理すると信じるべきですか、それとも例示された動作を避けて、自分ですべてを明示的に名前付け/削除する必要がありますか?

4

3 に答える 3

4

はい、ウィジェットは所有権を取得し、自動的に破棄されます:

http://www.webtoolkit.eu/wt/doc/reference/html/overview.html

ウィジェット階層にウィジェットを挿入すると、所有権はツリー内のその親に転送されます。

これは不適切に定義されたインターフェースです。古い学校から、人々はまだCインターフェースのようなインターフェースを定義していました。

最新の C++ ライブラリはスマート ポインターの概念を使用するようになっているため、ポインターの受け渡しはばかげた考えです。これにより、ポインターの所有権の概念をコードに文書化する (そしてコンパイラーによって強制する) メカニズムが提供されます。

于 2012-04-16T16:56:30.810 に答える
3

自動的にではありません。オブジェクトは、オブジェクトWContainerWidgetを「所有」していることを認識しているWText必要があり、適切なタイミングで何かがオブジェクトを削除することを保証する必要があります。

これは伝統的に、値WContainerWidgetのリストを持っていることを意味し、デストラクタでは、保存されている各値を通過して呼び出します。Widget*~WContainerWidgetdelete

また、スマート ポインター (auto_ptrそれがすべての場合は 、shared_ptrBoost または C++11 の場合は ) を使用して各WText*値を保持することもできます。これにより、スマート ポインターが破棄されるたびにオブジェクトが確実に解放されます。

于 2012-04-16T15:12:06.370 に答える
1

答えは簡単です: いいえ (*)

ダングリング ポインターが発生し、最終的にメモリ リークが発生する

(※絶対というわけではありません)

オブジェクトの制御を維持しながらnewを実行する方法があります (クラスの new 演算子をオーバーロードします)。ただし、これは一般的ではありません。より一般的なアプローチは、オブジェクト ファクトリを使用することです。その場合、新しいものは表示されません

于 2012-04-16T15:11:41.473 に答える