問題タブ [destructor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 例外でデストラクタが呼び出されないのはなぜですか?
A::~A()
私はこのプログラムで呼び出されることを期待していましたが、そうではありません:
ただし、最後の行を次のように変更すると
A::~A()
が呼び出されます。
Visual Studio 2005 から「Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86」でコンパイルしています。 コマンドラインはcl /EHa my.cpp
.
コンパイラはいつものように正しいですか? この問題について標準は何と言っていますか?
php - PHP: デストラクタ vs register_shutdown_function
その場でPNG画像を作成してブラウザに送信するPHPクラスがあります。PHP マニュアルには、メモリを解放するためにimagedestroy関数が最後に呼び出されることを確認する必要があると書かれています。クラスを使用していなければ、次のようなコードになります。
ただし、私のクラスの適切な場所は、クラスのデストラクタでimagedestroyを呼び出すことだと思います。
デストラクタがシャットダウン関数と同じように呼び出されるかどうかを確認できませんでしたか? たとえば、ユーザーがブラウザの STOP ボタンを押したときに実行が停止した場合。
注: 回答に何を書いても、それをサポートする記事またはマニュアル ページ (URL) を参照してください。
c++ - ジェネリックstd::vectorデストラクタを作成するにはどうすればよいですか?
オブジェクトへのポインタを含むベクトルがあり、clear関数を使用しても、ベクトル内のオブジェクトのデストラクタは呼び出されません。これを手動で行う関数を作成しましたが、これをベクトル内にある可能性のあるあらゆる種類のオブジェクトのジェネリック関数にする方法がわかりません。
これは、ベクトル内の特定のタイプのオブジェクトに対して正常に機能する関数ですが、オブジェクトポインターを使用して任意の種類のベクトルを取得できる単一の関数が必要です。
c++ - オブジェクトの配列を動的に割り当てる
動的に割り当てられた配列を含むクラスがあります。
しかし今、これらのクラスの動的に割り当てられた配列を作成したいと考えています。これが私の現在のコードです:
しかし、これはひどく爆発します。(呼び出しで)作成された新しいA
オブジェクトは、ループの反復が終了すると破棄されるため、これはそのインスタンスの内部が-ed になることを意味します。A(3)
for
myArray
A
delete []
それで、私の構文はひどく間違っているに違いないと思いますか? やり過ぎと思われる修正がいくつかあると思いますが、避けたいと思っています。
- のコピー コンストラクタを作成します
A
。 vector<int>
andを使用vector<A>
するので、これらすべてについて心配する必要はありません。- オブジェクト
arrayOfAs
の配列ではなく、ポインターの配列にします。A
A*
これは、内部動的割り当てを持つものの配列を動的に割り当てようとするときに実際に機能する構文がある初心者向けのものだと思います。
(また、私が C++ を使用してからしばらく経っているので、スタイルの批評も高く評価されています。)
将来の視聴者向けの更新: 以下の回答はすべて非常に役に立ちます。コード例と便利な「4 のルール」により、Martin のコードは受け入れられますが、すべてを読むことを強くお勧めします。何が間違っているかを簡潔に述べた優れたものもあれば、vector
s がどのように、そしてなぜ良い方法なのかを正しく指摘しているものもあります。
c# - 静的ファイナライザ
いくつかの静的ファイナライズを実行する正しい方法は何ですか?
静的デストラクタはありません。イベントはAppDomain.DomainUnload
デフォルト ドメインでは発生しません。イベントは、すべてのAppDomain.ProcessExit
イベント ハンドラー間で合計 3 秒 (既定の設定) の時間を共有するため、実際には使用できません。
c++ - ダミー パラメーターを使用する C++ クラス メンバー関数
operator++
ダミーの「int」パラメーターを使用して、これらの演算子の後置バージョンをオーバーライドできることは知っていますがoperator--
、デストラクタで宣言できるダミーパラメーターについて漠然と覚えています。誰かがそれについて何か知っていますか?もしそうなら、そのダミーパラメータは何をしましたか?
これは私が 10 代の頃 (つまりずっと前) に読んだ古い Turbo C++ チュートリアルの本にあったので、完全に記憶違いかもしれません。これも、標準化される前の非常に初期の C++ であったため、Turbo C++ 固有のものである可能性があります。
c++ - C++ で何かを強制的に最後に破棄する
私は、定期的に(newを使用して)作成および破棄されるコントローラーオブジェクトを内部的に持つC++アプリに取り組んでいます。これらのコントローラーは、自分自身を別のオブジェクト (controllerSupervisor と呼びましょう) に登録し、破棄されたときに自分自身を登録解除する必要があります。
私が現在直面している問題は、アプリケーションを終了したときに発生しています。破壊の順序は決定論的ではないため、コントローラー自体の (一部の) 前に単一の controllerSupervisor インスタンスが破壊され、それらが unregister メソッドを呼び出したときに発生します。それらのデストラクタは、すでに破壊されたオブジェクトに対して行います。
これまでに私が思いついた唯一のアイデア (大きな風邪をひいているので、これはあまり意味がないかもしれません) は、controllerSupervisor をスタック上のグローバル変数としてではなく、ヒープ上に (つまり new を使用して) 持つことです。ただし、その場合、削除する場所がありません(これはすべてサードパーティの種類のライブラリにあります)。
可能なオプションについてのヒント/提案をいただければ幸いです。
c++ - 単体テストのデストラクタ?
デストラクタを単体テストする良い方法はありますか? たとえば、この(不自然な)例のようなクラスがあるとします:
#ifdef TEST で hpp ファイルを混乱させたり、カプセル化を壊したりせずに x が削除されることを確認するために、これを単体テストする良い方法はありますか? 私が見ている主な問題は、特にデストラクタが呼び出された時点でオブジェクトがスコープ外にあるため、 x が本当に削除されたかどうかを判断するのが難しいことです。
c# - C#でのIDisposableとデストラクタの使用の違いは何ですか?
デストラクタではなくクラスに IDispose を実装するのはいつですか? この記事を読みましたが、まだ要点がわかりません。
オブジェクトに IDispose を実装すると、ガベージ コレクターがそれを行うのを待つのではなく、オブジェクトを明示的に「破棄」できると仮定しています。これは正しいです?
オブジェクトに対して常に明示的に Dispose を呼び出す必要があるということですか? これのいくつかの一般的な例は何ですか?
c++ - デストラクタ C++: タイプ '***' 引数が 'delete' に指定されました。ポインタが必要です
プライベート変数を宣言しました
私の SomeClass クラス内のどこかに。
delete theVector
SomeClass デストラクタ内で言えないのはなぜですか?
コンパイラエラーは次のように述べています:
予想されるポインターは何ですか?