問題タブ [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++ - C++ - 非ポインター クラス メンバーはいつ破棄されますか?
このコードがあるとします...
QMap factory_ はいつ破棄されますか? デストラクタへの呼び出し前、またはデストラクタ中? (GraphFactory のインスタンスが範囲外になると、デストラクタが呼び出されることは理解しています。しかし、ポインタ以外のメンバーはいつ破棄されますか?)
編集:デストラクタに到達すると、factory_ マップの無効な値が取得されます。ブレーク ポイントは、値が QMap 内に格納されている値と改ざんされていないことを示しています。
c++ - スタック変数をコピーするときの異常なデストラクタの動作
スタック変数の代入を上書きする前にデストラクタが呼び出されたかどうかを確認するテストを作成しましたが、結果の合理的な説明が見つかりません...
これは私のテストです (Visual C++ 2008 リリース モードで):
仮説が正しければ「abcd」、偽であれば「d」を期待していました。代わりに「bcdx」が表示されます。「x」は、ランダムなヒープ値を読み取っていることを示す ptr に割り当てられているメモリの量に応じて変化します。
何が起こっていると思いますか(間違っている場合は修正してください)、各コンストラクター呼び出しが新しいスタック値を作成し(それらをs1、s2、s3、s4と呼びましょう)、割り当てによってs1.ptrがs4.ptrによって上書きされたままになります. s4 はコピーの直後に破棄されますが、s1 (ダングリング ptr を含む) はスコープを離れると破棄され、s4.ptr が二重に削除され、元の s1.ptr は削除されません。
shared_ptrs の使用を伴わない、この役に立たない動作を回避する方法はありますか?
編集: 「削除」を「削除 []」に置き換え
c++ - char-arrayのベクトルでのC++GCC4.3.2エラー
問題はこのバグに似ています
C++のstd::vectorに配列を格納することに関する質問
しかし、別の理由で(以下を参照)。
C ++の次のサンプルプログラムの場合:
GCC4.2.3はきれいにコンパイルされます。GCC 4.3.2は、次のエラーを発行します。
理由はどうやらこのビットにあります
p>これは、配列からポインタへの減衰が正しくないために呼び出されると思います。
私の質問は: std :: vectorでの配列の保存を妨げる言語標準に何かありますか?それとも、その特別なGCCバージョンの単なるバグですか?
私はこれがコンパイルされるべきだと信じています(つまり4.2.3が正しい)。
ありがとうマーティン
c++ - C++のメモリ割り当てと削除に関する質問
悪いエラーが発生します。オブジェクト階層の最上位にあるオブジェクトに対してdeleteを呼び出すと(子オブジェクトが削除されることを期待して)、プログラムが終了し、次のようになります。
続いて、ある種のメモリダンプのように見えます。私はこのエラーを検索しましたが、私が収集したものから、すでに削除されているメモリを削除しようとすると発生するようです。この削除を試みるコードには1つの場所しかないため、不可能です。ここに奇妙な部分があります:それはデバッグモードでは発生しません。問題のコード:
p>ハイトマップデストラクタのすべてをコメントアウトしましたが、それでもこのエラーが発生します。エラーが発生した場合、
印刷されます。デバッグモードでは、コードをゆっくりとステップスルーできます。
が印刷され、エラーはありません。'ハイトマップの削除;'をコメントアウトすると 行、エラーは発生しません。上記のデストラクタは、別のデストラクタから呼び出されます(個別のクラス、仮想デストラクタなどはありません)。ハイトマップポインタは、次のようなメソッドで新しく追加されました。
p>静的メソッドのスタックスペースで初期化されたポインタを返すことと関係があるのでしょうか?削除は正しく行っていますか?私がチェックしたり、より良くしたりできることに関する他のヒントはありますか?
vb6 - VB6 コレクションの削除で Class_Terminate が発生しない
あらかじめお詫び申し上げます。これは長い質問です。できる限り単純化しようとしましたが、それでも、見たいと思うよりも少し長くなります。
一部のレガシー コードには、VB6 コレクションがあります。このコレクションは、.Add メソッドを介してオブジェクトを追加し、.Remove メソッドを介してオブジェクトを削除します。ただし、トレースを介して、.Remove が呼び出されたときに、オブジェクトのクラス終了が呼び出されていないように見えることがあります。しかし、一貫性がありません。まれにしか発生せず、クラスの終了に失敗する状況を特定することはできません。
次のデモ コードを検討してください。
と
これはテスト ハーネス コードです。
これで、実行ごとに、Servant の class_terminate が常に呼び出されます。また、参照されているコレクション内のオブジェクトを保持する必要がある製品コードには何も表示されません。
1.) Remove でクラスを強制的に終了させる方法はありますか? つまり、Obj.Class_Terminate を呼び出して、毎回動作することを保証できますか?
2.) 私の製品コード (および私の小さなテスト アプリ) では、クラスは「Instancing - 5 MultiUse」とマークされています。これはある種のスレッドの問題である可能性があります。マルチスレッドがこの問題の原因であることを証明 (または反証) する効果的な方法はありますか?
編集: 以下の MarkJ の洞察に満ちたコメントによると、上記に投稿されたテストと製品コードは両方とも ActiveX exe のものであることを追加する必要があります。これは、マルチスレッドについて質問する理由の一部です。
c++ - C++ スタック割り当てオブジェクト、明示的なデストラクタ呼び出し
既存のライブラリで作業しているときに、デストラクタの奇妙な使い方に出くわしました。スタックに割り当てられた stl ベクトルのデストラクタが、そのオブジェクトを再度使用する必要がある場合に、明示的に呼び出されていました。clear
これらのベクトル オブジェクトは、特殊なメソッドを持つ stl ベクトル クラスのわずかにカスタマイズされたバージョンです。clear()
デストラクタ本体には、 、の 2 つのメソッド呼び出しが存在します_Tidy()
。
このデストラクタが単にではなく呼び出されている理由を考えてみましたがclear
、途方に暮れています。なぜこれが良い考えなのか、誰かに光を当ててください。
c++ - STL コンテナに仮想デストラクタがないのはなぜですか?
STL コンテナに仮想デストラクタがない理由を知っている人はいますか?
私が知る限り、唯一の利点は次のとおりです。
- インスタンスのサイズを (仮想メソッド テーブルへの) 1 つのポインターだけ減らします。
- 破壊と構築が少し速くなります。
欠点は、コンテナを通常の方法でサブクラス化するのは安全ではないことです。
編集: おそらく私の質問は、「継承を許可するように設計された STL コンテナーではなかったのはなぜですか?」と言い換えることができます。
それらは継承をサポートしていないため、STL 機能と少数の追加機能 (マップのデフォルト値を持つ特殊なコンストラクターまたは新しいアクセサーなど) を必要とする新しいコンテナーが必要な場合、次の選択肢に行き詰まります。または何でも):
- コンポジションとインターフェイスのレプリケーション: STL コンテナーをプライベート メンバーとして所有し、STL メソッドごとに 1 つのパススルー インライン メソッドを持つ新しいテンプレートまたはクラスを作成します。これは継承と同じくらいパフォーマンスが高く、仮想メソッド テーブルのコストを回避できます (重要な場合)。残念ながら、STL コンテナーにはかなり幅広いインターフェイスがあるため、一見簡単に実行できるはずのコード行が多数必要になります。
- Just make functions : メンバー関数を追加する代わりに、ファイル スコープの関数を使用します。いくつかの点でこれは良い方法かもしれませんが、カプセル化の利点は失われます。
- パブリック STL アクセスによる構成: STL コンテナーの所有者に、ユーザーが STL コンテナー自体にアクセスできるようにします (おそらくアクセサーによって保護されます)。これにより、ライブラリ作成者のコーディングは最小限で済みますが、ユーザーにとってはあまり便利ではありません。コンポジションの大きなセールス ポイントの 1 つは、コード内の結合を減らすことですが、このソリューションでは、STL コンテナーと所有者コンテナーが完全に結合されます (所有者が真の STL コンテナーを返すため)。
- コンパイル時のポリモーフィズム: 書くのがやや難しい場合があり、コードの体操が必要で、すべての状況に適しているわけではありません。
副次的な質問として、非仮想デストラクタを使用してサブクラス化する標準安全な方法はありますか (新しいメソッドを追加したいだけで、メソッドをオーバーライドしたくないと仮定しましょう)。私の印象では、非仮想クラスを定義するコードを変更する権限がない場合、これを行う一般的で安全な方法はありません。
編集2:
@docが指摘しているように、C++ 11 の洗練されusing
た宣言により、構成のコストがいくらか削減されます。
c++ - 「'<'トークンの前に予想されるコンストラクタ、デストラクタ、または型変換」
構文/解析エラーが発生していますが、見つからないようです。
DataReader.h:11:エラー:'<'トークンの前にコンストラクタ、デストラクタ、または型変換が必要です
DataReader.hは次のとおりです。
そしてこれは.cppファイルです:
DataReader()の内容は関係ないと思うのでスキップしましたが、必要に応じて投稿できます。
入力/提案をありがとう。
c++ - デストラクタでメモリがすでに解放されているかどうかを確認する方法は?
allegro オープン ソース ライブラリを使用したシンプルなタンク ウォーズ スタイルのゲームがあります。私のタンク クラスでは、ビットマップ オブジェクトへのポインターの配列を 0 に初期化します。次に、メモリを割り当てて初期化する allegro 関数 create_bitmap を使用して新しいオブジェクトを作成します。
それから私はいつものように私の仕事に取り掛かります。
問題は、善良な OO 少年のようにクラス デストラクタでビットマップ メモリを解放しようとすると、プログラムがクラッシュすることです。これは、この特定のプログラムでは、allegro ライブラリがクラスの前にクリーンアップ (作成したビットマップ オブジェクトを解放する) を行うためです。範囲外になり、破壊されます。ただし、ポインタが再度 NULL に設定されるわけではないため、ビットマップがまだ有効かどうかを確認できず、解放しようとするとプログラムがクラッシュします。
これを回避する方法はありますか?NULL でない場合、有効なポインターをチェックできますか? クラスがプログラム内で別の方法で使用されている場合、メモリが解放されていることを確認するにはどうすればよいですか。現在のところ、私は基本的に削除せずに new を呼び出していますが、それは好きではありません。
c++ - シグナル ハンドラでデストラクタを明示的に呼び出す
必要なクリーンアップを実行するデストラクタがあります (プロセスを強制終了します)。SIGINT がプログラムに送信された場合でも実行する必要があります。私のコードは現在次のようになっています:
これは機能しますが、デストラクタを明示的に呼び出すことに対して多くの警告があるようです。これはこの状況で正しいことですか、それとも「より正しい」方法はありますか?