1

私は wxWidgets チュートリアルを読んでいました: http://docs.wxwidgets.org/trunk/overview_helloworld.html

そして、削除せずに new を使用していることに気付きました。これはどのように可能ですか:Sクラスを削除せずにクラスでnewを使用するにはどうすればよいですか:S私には意味がありません:l

誰かが何が起こっているのか説明できますか?

4

5 に答える 5

7

プログラムの実行の最後に、プロセスのメモリ空間内のすべてのメモリが OS によって解放されます。

チュートリアルでは、インスタンス化されたオブジェクトをプログラムの最後まで有効にする必要がある簡単な例を示した可能性があります。

たとえば、プログラムのウィンドウを作成すると、プログラムが終了するまで存続します。OSが削除してくれるので、削除する必要はありません。

これが良い習慣だと言っているわけではありません。良い習慣を身につけるために、メモリを解放することを明示的に管理することを常にお勧めします。

c++ には、refcount が 0 に達したときにオブジェクトの削除を処理するスマート ポインターなどの他のオプションがありますが、それがここで起こっていることではないと思います。

于 2013-05-29T17:41:59.077 に答える
2

一部のクラス ライブラリには、ポインタの所有権を子として親オブジェクトに与える規則があります。

この場合、newオブジェクトを所有者オブジェクトに渡すとき、それは所有者deleteのポインターへのタスクです。

たとえば、ウィジェット オブジェクトはその子リストに GUI コントロールを追加します。所有者が削除される場合、そのデストラクタdeleteは子です。

 

メモリ リークの回避については、wxWidgetsのドキュメントを参照してください。

子ウィンドウ

wxWindow が破棄されると、そのすべての子が自動的に削除されます。これらの子は、コンストラクターで親引数としてウィンドウを受け取ったすべてのオブジェクトです。

結果として、子ウィンドウを含む派生クラスを作成する場合は、メイン ウィンドウのメンバーとしてオブジェクト自体ではなく、子ウィンドウへのポインターを使用する必要があります。

于 2013-05-29T17:53:35.187 に答える
1

はい、new呼び出しなしで使用することは可能deleteですが、一般的には悪い形式です。ただし、自分自身を明示的にnew呼び出さずに呼び出したからといって、呼び出されないわけではありません。GUI フレームワークに関しては、それらの多くは外部イベントに基づいて内部的に呼び出しを処理します。たとえば、ウィンドウを表すオブジェクトを作成するために 呼び出した場合、OS がウィンドウを破棄したときにGUI フレームワーク呼び出す可能性があります。フレームワークに精通しているか、そのドキュメントを読んでいない限り、明らかではないかもしれません。deletedeletenewdelete

また、特定のリソースへのポインターを保持し、スマート ポインター自体が破棄されると解放 (削除) するオブジェクトである "スマート ポインター" もあります。Boost と C++11 は、std::unique_ptrを使用して作成されたオブジェクトの有効期間 (および所有権) を管理するために非常に頻繁に使用されるスマート ポインター (たとえば)の実装を提供しますnew。もちろん、これはスマート ポインターの一般化です。参照カウントやその他のメカニズムを使用して、リソースが使用されなくなった場合にのみリソースが解放されるようにするさまざまな実装があるためです。

スマート ポインター、リソースの有効期間、リソースの所有権などに関する多くの記事が Web に出回っています。「C++ スマート ポインター」の簡単な Stackoverflow または Google Dance は、さらに読むためのリソースのさまざまな大きなリストを提供します。頭字語 RAII および SBRM を検索すると、多数のリソースのリストも表示されます。

于 2013-05-29T18:04:01.493 に答える
1

Delete なしで New を使用できますが、プログラムが終了するまでオブジェクトの有効期間を継続させたい場合に限ります。一般的に、それは悪い形と考えられています。

于 2013-05-29T17:41:40.370 に答える
0

これは、wxFrameクラスの実装方法に関係しています。フレームを閉じると、オブジェクトは削除されます。

wxWidgets ドキュメントの引用:

wxFrame のデフォルトのクローズ イベント ハンドラは、Destroy() を使用してフレームを破棄します。

通常、new で割り当てたオブジェクトを削除する必要がありますが、この場合は他の誰かがあなたのためにそれを行っています。

于 2013-05-29T17:52:59.057 に答える