• ベストアンサー

クラスの消滅時に処理をさせたいのですが

C++のデストラクタのように、クラスの解放時に決まった処理をさせる方法はありませんでしょうか? よろしくお願いします。

noname#209929
noname#209929
  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • _layla_
  • ベストアンサー率100% (1/1)
回答No.2

こんな感じに書けば出来るようです。 class SomeResourceManager{ SomeResourceType sr; SomeResourceManager(SomeResourceType y){sr = y;} public void finalize(){ ... clean up someResource ...} } class Foo{ static SomeResourceManager x = new SomeResourceManager(someResource); }

参考URL:
http://java.sun.com/docs/books/jls/class-finalization-rationale.html
noname#209929
質問者

お礼

ありがとうございます。やってみますね。

その他の回答 (1)

noname#9414
noname#9414
回答No.1

Javaにもデストラクタはありますが・・・ そこで実行をさせるようにしてもダメだということ なのでしょうか? ではでは☆

noname#209929
質問者

補足

ありがとうございます。 こちらでも調べてみました。 object.finalize()のことをおっしゃってるんですよね? http://www11.upage.sonet.ne.jp/ga2/noji/reseach/990809.htm ↑これはjava1.2ですが、1.3では改善されているようですね。 これより良い方法があればお願いします。

関連するQ&A

  • インスタンス破棄時にメモリが解放されるようにしたい

    C++言語でプログラムを作成しています あるクラスでインスタンス生成時に動的にメモリを割り当てた後 インスタンスが破棄されるまでそれを使用し インスタンス破棄時に解放するにはどうしたらいいでしょうか デストラクタで解放処理を実装すると 明示的にデストラクタが呼ばれた際に解放されてしまい インスタンスが破棄されるまで使用できませんでした

  • C++のクラスの仮想デストラクタについて

    C++のクラスの仮想デストラクタについて教えてください。 デストラクタは、クラスの名前の前にチルダを付けたものが名前になりますが、とあるクラスの継承クラスは、その親クラスとクラス名が違うので、デストラクタの名前も親クラスのものとは別になる。つまり。継承関係のあるクラスでもデストラクタはオーバーライドせず、各クラス毎に別の名前で存在する、ということになると思います。 ですので http://wisdom.sakura.ne.jp/programming/cpp/cpp31.html このページの下部にあるように、「デストラクタは、派生クラスから基本クラスへ向かって順番に呼び出される」というのもなんとなく合点が行きます。 しかし、仮想デストラクタというものがあることを知りました。 上記のようにデストラクタは継承関係のあるクラス間でも、それぞれクラス毎に作ればよいと思っていましたが、子クラスの方でオーバーライドする必要がある場合があるのでしょうか。あるとすれば、それはどんな場合なのでしょうか。 また、上記のURLでは、「C++ 言語のデストラクタはオーバーライドを行いません」と書いてあり、なんだかよく分からなくなってきました。仮想デストラクタというものが存在するのに? どなたか詳しい方いらっしゃいましたらご教示頂けると幸いです。

  • privateデストラクタを持つクラスの拡張

    C++でprivateなデストラクタを持つクラスを拡張してサブクラスを作る方法はありますか?

  • C++でのクラスオブジェクトの破棄

    こんにちは。 C++では、プログラムの終了時に、全てのクラスオブジェクトは、デストラクタが呼び出されて破棄されますが、プログラムの途中で、クラスオブジェクトを明示的に破棄する方法はあるのでしょうか? 例えば、new演算子によってメモリを動的に割り当てたポインタなら、delete演算子で破棄できますが、 クラスオブジェクトにdelete演算子は使えないようです。 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。

  • C++の解放時の動作

    お世話になっております。 C++の解放時の動作について疑問があるため質問させていただきます。 class Super{ private: float x, y, z; public: ~Super(){} }; class Child : public Super{ private: int a, b, c; public: ~Child(){} }; int main( int argc, char **argv ){ A *a = new Child: delete a; return 0; } 簡略ですが、上記を走らせた場合、インスタンスは正しく解放されるのでしょうか? 一応デストラクタは動作しますが、実際のところ、子クラス分のデータが解放されない気がします。 ネット上のサンプルでこういった例を時々目にしますが、この方法は問題ないのでしょうか? よろしくお願いいたします。

  • C#の解放処理の速さ

    C#の解放処理の速さ C#にはガーベジコレクションやDisposeがありますが、解放処理で一番高速なのはなんなのでしょうか?

  • クラスの実体を一つにする方法

    現在、以下の構成でアプリケーションを開発しています。 フォーム(C#)⇔ラップDLL(C++/CLI)⇔処理(C++ネイティブのDLL多数) C++DLLのひとつにクラスAがあるとします。 このクラスAを含むDLLは他のDLLにリンクされています。 このクラスAの実体がアプリケーションの中で一つしかないようにするにはどのようにコーディングすれば良いのでしょうか? シングルトンパターンについて書かれたHPを参考につくってみたのですが、アプリケーションを実行するといくつも実体が作られています。 class __declspec(dllexport) DataStore { private: DataStore(): // コンストラクタ {}; ~DataStore() {}; // デストラクタ public: // このインスタンスを使用してメンバにアクセスする。 static DataStore& GetInstance() { static DataStore myInstance; return myInstance; } };

  • C++ Vectorのデストラクタ

    C++ Vectorのデストラクタ boost::any型のVectorに自作クラスをpush_backで入れると、なぜかその自作クラスのデストラクタが呼ばれてしまって困っています。 またそのクラスの関数を実行すると同じようにデストラクタが呼ばれてしまいます。 

  • C++ビルダーでイベント付きスレッドクラスを作成したい

    C++系(主にボーランドビルダー)でVBの様なイベント付きクラスを作成したいのです。 単なるスレッドクラスの定義は: //---------------------------------------------- // クラス // スレッドクラスより派生 //---------------------------------------------- class CUserClass : public TThread { private: AnsiString aa; HANDLE hr; // ハンドル protected: HWND FormHandle; // 親フォームハンドル void __fastcall Execute();// スレッドメイン処理 public: __fastcall CUserClass(bool,AnsiString ,HWND ); // コンストラクタ __fastcall ~CUserClass(); // デストラクタ }; でいいのですが・・・。 何かクラス側で変化があったとき、クラスを使う親側モジュールにイベントを発生させたいのですが。 クラス側から親側に SendMessage( 親側ハンドル, 送りたいメッセージ, 0, 0 ); でメッセージを送る方法があるのですが、これだと親側がクラスでないといけないし、送りたいメッセージが固定となるし・・・。 よい方法を教えてください。

  • あるクラスの派生クラスと、その他の型で処理を振り分

    ■環境 Windows7 Visual Studio 2010 Visual C++(C++11) 大抵の型は共通処理を行いたいが、ある特定の型だけは特別な処理を行いたい、 そんなケースでは、テンプレートの明示的な特殊化が利用出来るかと思います。 しかし、『ある特定の抽象クラスの派生クラス』だけは特別な処理を行いたい、 これを実現するには、どのようにするのがよろしいでしょうか? 以下のコードは、意図した通りに動作しません。 良い方法があれば、ご教授いただけますでしょうか? // 抽象クラス class AbstractClass { public: virtual void MustOverides() = 0; }; // 派生クラス class ChildClass : public AbstractClass { public: virtual void MustOverides(){}; }; template<typename AnyType> void CommonFunc(const AnyType& target) { // 呼ばれる } template<> void CommonFunc<AbstractClass>(const AbstractClass& target) { // 呼ばれない、呼ばせたい } void CommonFunc(AbstractClass& target) { // 呼ばれない、呼ばせたい } void CommonFunc(const AbstractClass& target) { // 呼ばれない、呼ばせたい } void main() { ChildClass Child; CommonFunc(Child); } よろしくお願いいたします。