問題タブ [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.
python - Python:ファイナライザーを介してプログラムを終了する前にバッファーをフラッシュする
透かしまたはオブジェクトのファイナライズのイベントで(永続ストレージに)フラッシュするトランザクションのキャッシュを保持します。__del__
すべてのオブジェクトで呼び出されることが保証されなくなったので、同様の関数(または__del__
それ自体)をatexit.register
(初期化中に)フックする適切なアプローチはありますか?
私が間違っていなければ、これにより、メソッドがバインドされているオブジェクトがプログラムが終了するまでぶらぶらします。これは問題になる可能性は低いですが、もっとエレガントな解決策があるのではないでしょうか。
注:キャッチできない例外が発生する可能性がある__del__
ため、使用が理想的ではないことはわかっていますが、プログラム全体でカスケード呼び出しを行わないで、これを行う別の方法を考えることはできません。TIA!finalize()
destructor - このコード行でバッファ オーバーラン エラーが発生するのはなぜですか?
コードは1行しかありません。これは次のとおりです。
関数内OnBnClickedButtonGo()
。この関数はリリース モードでは失敗しますが、デバッグ モードでは問題なく動作します。
(Windows XP で Visual Studio 8 を使用しています。)
エラーメッセージは次のとおりです。
目に見えず、暗示されているデストラクタだと思います...しかし、私は本当に知りません。
PS: PCRE lib バージョン 7.8 に静的にリンクしています。PS2: あまり関連性はありませんが、PCRE ライブラリへのリンクに問題がある一部の人々を助けるかもしれません (それを整理するのに何時間もかかりました): 行を含めます#define PCRE_STATIC
.
c++ - C++ でのカスタム オブジェクトのコンストラクタ/デストラクタと new/delete 演算子について
自分で作成したリンク リストがあるとします。メモリを解放する独自のデストラクタがあります。この Linked List は、new または delete をオーバーロードしません。
今、私は上記のリンクされたリストの配列を作成しようとしています(私が正しく理解していれば、ハッシュを開きます)。次に、このオープン ハッシュ クラスのコンストラクター内に必要なメモリを割り当てます。コンストラクター内で呼び出される new 演算子は、配列にメモリを正しく割り当てるのに十分ですよね? Linked List クラスの new をオーバーロードしていないため、よくわかりません。
また、リンク リストの配列が要素と呼ばれると仮定すると、デストラクタに「delete[] 要素」と記述できますか? 配列内の各要素のデストラクタを呼び出して、メモリを正しく解放しますか?
最後に、両方の仮定が正しい場合 (つまり、カスタム クラスで使用するために new と delete をオーバーロードする必要がない場合)、そのような演算子をオーバーロードするポイントは何ですか?
c++ - 「これを削除する」の使い方は?
今日、いくつかのレガシー コードを見てきました。デストラクタには " " のような文がありdelete this
ます。この呼び出しは再帰的だと思います。なぜ機能しているのですか?
Y! を簡単に検索したところ、ユーザーがスタック オブジェクトを作成することを制限する必要がある場合は、デストラクタを非公開にし、インスタンスを削除するためのインターフェイスを提供できることがわかりました。提供されたインターフェイスでは、このポインターで delete を呼び出す必要があります。
そのようなステートメントを使用する他の状況はありますか?
c++ - 組み込み型のデストラクタ (int、char など)
C++ では、次のコードでコンパイラ エラーが発生します。
このコードはほぼ同じです。int を別の型に typedef すると、魔法のようなことが起こります。
2 番目のコードが機能するのはなぜですか? int は型定義されているという理由だけでデストラクタを取得しますか?
なぜこれをやりたいのか疑問に思っている場合: これは、C++ コードのリファクタリングに由来します。標準のヒープを削除し、自作のプールに置き換えます。これには、placement-new とデストラクタを呼び出す必要があります。プリミティブ型のデストラクタを呼び出すのは役に立たないことはわかっていますが、後で POD を実際のクラスに置き換える場合に備えて、コード内にデストラクタが必要です。
裸の int は機能しないが、typedef の int は機能することがわかったのは、かなりの驚きでした。
ところで-テンプレート関数を含むソリューションがあります。テンプレート内で typedef するだけで、すべて問題ありません。
c++ - C++ デストラクタの宣言に throw() を追加する必要がありますか?
次のように定義されたデストラクタを持ついくつかの C++ クラスを見てきました。
これは良い考えですか?
デストラクタが例外をスローしてはならないことは十分承知していますが、実際にデストラクタで例外をスローすることはできますか? 私はそれが何を保証するのか100%確信が持てません。
参考:この最近の質問
c++ - デストラクタとメンバー関数の競合
デストラクタ内にいるとき、他のスレッドがオブジェクトのメンバー関数の実行を開始する可能性はありますか? この状況にどう対処するか?
c++ - C++ デストラクタの奇妙な動作
この小さなプログラムは、コマンド ラインから単純に実行すると、実行に数秒かかります。ただし、デバッガーで実行すると、8 秒以上かかります。デバッガーを一時停止すると、デバッガーがこれらすべてのベクターを破棄している最中であることがわかります。なんてこと?
注 - Visual Studio 2008 SP1、Core 2 Duo 6700 CPU、2 GB の RAM。
追加:明確にするために、いいえ、デバッグ ビルドとリリース ビルドを混同していません。これらの結果は 1 つの同じ .exe にあり、途中で再コンパイルすることさえありません。実際、デバッグ ビルドとリリース ビルドを切り替えても何も変わりません。