タグ付けされた質問 「destructor」

21
Javaのデストラクタはありますか?
Javaのデストラクタはありますか?これに関するドキュメントを見つけることができないようです。ない場合、どうすれば同じ効果を達成できますか? 私の質問をより具体的にするために、私はデータを処理するアプリケーションを書いており、仕様では、アプリケーションを元の起動した状態に戻す「リセット」ボタンがあるべきだと述べています。ただし、アプリケーションが閉じているか、リセットボタンが押されていない限り、すべてのデータは「ライブ」である必要があります。 通常はC / C ++プログラマーなので、これを実装するのは簡単だと思いました。(したがって、最後に実装する予定でした。)リセットボタンが押されたときにすべての「ライブ」オブジェクトを破棄できるように、すべての「リセット可能な」オブジェクトが同じクラスにあるようにプログラムを構成しました。 データを逆参照してガベージコレクターがデータを収集するのを待つだけでよいのかと考えていましたが、ユーザーが繰り返しデータを入力してリセットボタンを押した場合、メモリリークは発生しませんか?また、Javaは言語としてかなり成熟しているので、これが起こらないようにする方法、またはこれに適切に取り組む方法があるはずだとも考えていました。

9
Pythonオブジェクトを正しくクリーンアップするにはどうすればよいですか?
class Package: def __init__(self): self.files = [] # ... def __del__(self): for file in self.files: os.unlink(file) __del__(self)上記はAttributeError例外で失敗します。が呼び出されたときにPythonが「グローバル変数」(このコンテキストのメンバーデータ?)の存在を保証しないことを理解してい__del__()ます。それが事実であり、これが例外の理由である場合、オブジェクトが適切に破壊されることを確認するにはどうすればよいですか?
462 python  destructor 

7
ベース仮想デストラクタを明示的に呼び出す必要がありますか?
C ++でクラスをオーバーライドする場合(仮想デストラクタを使用)、継承するクラスで仮想としてデストラクタを再度実装しますが、基本デストラクタを呼び出す必要がありますか? もしそうなら、それはこのようなものだと思います... MyChildClass::~MyChildClass() // virtual in header { // Call to base destructor... this->MyBaseClass::~MyBaseClass(); // Some destructing specific to MyChildClass } 私は正しいですか?
350 c++  destructor 

16
デストラクタから例外を投げる
ほとんどの人が言うん未定義の動作結果そう-デストラクタの外に例外をスローしません。Stroustrupは、「ベクターデストラクタはすべての要素に対して明示的にデストラクタを呼び出す。これは、要素デストラクタがスローすると、ベクトルの破棄が失敗することを意味する...デストラクタからスローされる例外から保護するための適切な方法は実際にはないため、ライブラリ要素デストラクタがスローした場合の保証はありません」(付録E3.2から)。 この記事はそうではないようです-投げるデストラクタは多かれ少なかれ大丈夫です。 だから私の質問はこれです-デストラクタからスローすると未定義の動作が発生する場合、デストラクタ中に発生したエラーをどのように処理しますか? クリーンアップ操作中にエラーが発生した場合、それを無視しますか?スタックを処理できる可能性があるが、デストラクタで正しく処理できないエラーの場合、デストラクタから例外をスローするのは理にかなっていますか? 明らかにこれらの種類のエラーはまれですが、可能です。



11
サブクラスへのポインターでの削除は、基本クラスのデストラクターを呼び出しますか?
私は、class Aそのフィールドの1つにヒープメモリ割り当てを使用しています。クラスAはインスタンス化され、別のクラス(class B。 クラスBのオブジェクトが完了したら、を呼び出しますdelete。これは、デストラクターを呼び出すと想定しています...しかし、これはクラスAのデストラクターも呼び出しますか? 編集: 答えから、私はそれを採用します(間違っている場合は編集してください): delete BのインスタンスがB ::〜B();を呼び出す 呼び出す A::~A(); A::~A deleteAオブジェクトのヒープに割り当てられたすべてのメンバー変数を明示的に指定する必要があります。 場合-最後のメモリブロックの記憶は、クラスBのインスタンスがヒープに返される前記新しいは、それが最初にすべてのデストラクタがオブジェクトを完成させるために呼び出された今後、それを初期化するコンストラクタを呼び出し、次に、ヒープ上のメモリのブロックを割り当てられ、使用されましたオブジェクトが常駐していたブロックがヒープに返されます。


12
C ++で純粋な仮想デストラクタが必要なのはなぜですか?
仮想デストラクタの必要性を理解しています。しかし、なぜ純粋な仮想デストラクタが必要なのでしょうか。C ++の記事の1つで、著者は、クラスを抽象化するときに純粋な仮想デストラクタを使用すると述べています。 しかし、メンバー関数のいずれかを純粋な仮想関数にすることで、クラスを抽象化できます。 だから私の質問は デストラクタを本当に仮想化するのはいつですか?誰かが良いリアルタイムの例を挙げられますか? 抽象クラスを作成するときに、デストラクタも純粋に仮想化することをお勧めしますか?はいの場合、なぜですか?

6
オブジェクトを破壊する方法は?
私の知る限り(これはごくわずかです)には、次の2つの方法があります。 $var = new object() 次に: // Method 1: Set to null $var = null; // Method 2: Unset unset($var); 他のより良い方法?ここで髪の毛を割っていますか?

10
C ++デストラクタはいつ呼び出されますか?
基本的な質問:プログラムはいつC ++でクラスのデストラクタメソッドを呼び出しますか?オブジェクトがスコープから外れたり、オブジェクトがdelete より具体的な質問: 1)オブジェクトがポインターを介して作成され、そのポインターが後で削除されるか、または指す新しいアドレスが与えられた場合、それが指し示していたオブジェクトはそのデストラクタを呼び出しますか(他に何も指していないと想定)? 2)質問1のフォローアップは、オブジェクトがスコープ外になるときを定義するものです(オブジェクトが特定の{block}をいつ出るかは関係ありません)。つまり、リンクされたリスト内のオブジェクトに対していつデストラクタが呼び出されるのでしょうか。 3)デストラクタを手動で呼び出しますか?
118 c++  destructor 

7
C#でのIDisposableとデストラクタの使用の違いは何ですか?
いつデストラクタではなくクラスにIDisposeを実装しますか?この記事を読みましたが、まだ要点がありません。 私の想定では、IDisposeをオブジェクトに実装すると、ガベージコレクターがIDisposeを実行するのを待つのではなく、明示的に「破棄」できるということです。これは正しいです? つまり、常にオブジェクトに対してDisposeを明示的に呼び出す必要がありますか?これのいくつかの一般的な例は何ですか?
101 c#  .net  dispose  destructor 

3
C#では、クラスのデストラクタとFinalizeメソッドの違いは何ですか?
クラスのデストラクタとFinalizeメソッドの違いは何ですか(ある場合)。 私は最近、Visual Studio 2008がデストラクタをFinalizeメソッドと同義と見なすことを発見しました。つまり、Visual Studioでは、クラスの両方のメソッドを同時に定義することはできません。 たとえば、次のコードフラグメント: class TestFinalize { ~TestFinalize() { Finalize(); } public bool Finalize() { return true; } } デストラクタでFinalizeを呼び出すと、次のエラーが発生します。 呼び出しは次のメソッドまたはプロパティ間であいまいです: 'TestFinalize。〜TestFinalize()'と 'TestFinalize.Finalize()' また、Finalizeの呼び出しがコメント化されている場合、次のエラーが発生します。 タイプ 'ManagementConcepts.Service.TestFinalize'は、同じパラメータータイプの 'Finalize'というメンバーを既に定義しています

2
GNU GCC(g ++):なぜ複数のdtorを生成するのですか?
開発環境:GNU GCC(g ++)4.1.2 ユニットテストで「コードカバレッジ-特に関数カバレッジ」を増やす方法を調査しようとしているときに、クラスdtorの一部が複数回生成されているように見えることがわかりました。何人かあなたはその理由について何か考えていますか? 次のコードを使用して、上記のことを試して観察しました。 「test.h」 class BaseClass { public: ~BaseClass(); void someMethod(); }; class DerivedClass : public BaseClass { public: virtual ~DerivedClass(); virtual void someMethod(); }; 「test.cpp」 #include <iostream> #include "test.h" BaseClass::~BaseClass() { std::cout << "BaseClass dtor invoked" << std::endl; } void BaseClass::someMethod() { std::cout << "Base class method" …
89 c++  g++  destructor 

3
shared_ptrマジック:)
リドストローム氏と私は議論をしました:) Lidström氏の主張は、構成shared_ptr<Base> p(new Derived);はBaseに仮想デストラクタを必要としないというものです。 Armen Tsirunyan:「本当に?shared_ptrは正しくクリーンアップされますか?この場合、その効果をどのように実装できるかを示していただけませんか?」 DanielLidström:「shared_ptrは独自のデストラクタを使用してConcreteインスタンスを削除します。これはC ++コミュニティではRAIIと呼ばれます。RAIIについてできる限りのことを学ぶことをお勧めします。これにより、C ++コーディングが非常に簡単になります。あらゆる状況でのRAII。」 Armen Tsirunyan:「RAIIについて知っています。また、pnが0に達すると、最終的にshared_ptrデストラクタが保存されたpxを削除する可能性があることも知っています。しかし、pxに静的型ポインタBaseと動的型ポインタがあるDerived場合Base、仮想デストラクタがない限り、これは未定義の動作になります。間違っている場合は修正してください。」 DanielLidström:「shared_ptrは静的型がConcreteであることを知っています。コンストラクターに渡したので、これを知っています。魔法のように見えますが、設計によるものであり、非常に優れていると確信できます。」 だから、私たちを判断してください。ポリモーフィッククラスに仮想デストラクタを持たせることなく、shared_ptrを実装することはどのように可能ですか?前もって感謝します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.