• ベストアンサー

classのdelete

C++についてです。 class aaa; class bbb; とあったとします。 class aaaは、内部にclass bbb型の配列を 持っているとすると、aaaをdeleteする場合には aaaのデストラクタがcallされると思うのですが bbbのデストラクタは自動でcallされるのでしょうか (class bbbは、明示的にdeleteしないといけないのでしょうか?) 宜しく御願い致します。

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

class aaa { bbb foo[3]; ... }; むしろdeleteすれば、windowsならエラーが発生します。 deleteはnewしたものに行うのです。 もしclass aaa { bbb* foo; ... };で foo = new bbb(); としたなら delete fooとする必要があります。 newはmalloc(...)とコンストラクタの呼び出し deleteはfree()とデストラクタの呼び出しをセットにしたものといえば わかりやすいでしょうか?

f_attck
質問者

お礼

御回答ありがとうございます。 大変勉強になりました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

class bbb { ... }; class aaa { bbb foo[3]; ... }; みたいな形なら bbb のデストラクタは自動的に呼出されます.

f_attck
質問者

お礼

御回答ありがとうございます。 勉強になりました。 >みたいな形なら bbb のデストラクタは自動的に呼出されます. ということですが、宣言方法等の違いにより デストラクタが自動でcallされないケースが存在する ということでしょうか? ※あげ足を取っているつもりはありません。

関連するQ&A

  • update,deleteについて

    お世話になります。 下のようなテーブルでデータのメンテナンスを行いたいのですが、update,deleteを効率良く行う方法はありますでしょうか? No カラムA カラムB カラムC カラムD  ---------------------------------------- 1 aaa 111 あああ 2 aaa 222 いいい 123 3 aaa 333 ううう 4 aaa 444 えええ 5 aaa 555 おおお 456 6 bbb 222 いいい 7 bbb 333 ううう 8 bbb 555 おおお カラムAが「aaa」のレコードと「bbb」のレコードがあり、カラムB,Cは一部のレコードが重複しています。 この状態から、 ・No2のカラムDをNo6のカラムDにセット ・No5のカラムDをNo8のカラムDにセット ・No2,3,5のレコードを削除 したいのです。 ※カラムB,Cが重複している場合、カラムAが「bbb」のレコードにカラムDの値を反映し、カラムAが「AAA」のレコードは削除したいです。 update,delete共に効率良く行う方法があれば、助かります。 初歩的な質問かも知れませんが、御教示いただけますと幸いです。 よろしくお願い致します。

  • delete演算子オーバーロードについて

    delete演算子オーバーロードする際、 デストラクタが呼び出される困っています。 例えば、 void* operator new(size_t size, const char* filename , int line , const char* funcname ); とnew演算子をグローバル定義します。 すると、意図通りnew演算子がCallされ、対応するコントラクタも 問題なくCallされます。 そして、上記new定義にペアとなるdelete演算子もグローバル定義します。 void operator delete(void* pMem, const char* filename , int line , const char* funcname ); 通常どおりdeleteで呼び出してしまうと、標準のdeleteがcallされてしまうため、 #define MYELETE(s) operator delete( (void*)(s) , __FILE__ , __LINE__ , __FUNCTION__ ) 上記のようなカスタムマクロを定義してCallしています。 オーバーロード定義されたアドレスがCallされるところまで、 意図通りなのですが、肝心のデストラクタがCallされません。 型が判明している場合、 単体でデストラクタを明示的に呼び出すことはできますが、 任意のポインタのデストラクタを明示的に呼び出す方法は ありますでしょうか?

  • newとdelete

    動的にaaa[5][40]という配列を作りたいのですけど,以下のプログラムでよろしいでしょうか? aaa = new double *[5]; for(int p = 0; p < 5; p++){ aaa[p] = new double [40]; } また,これをdeleteするときはどのようにすればよろしいのでしょうか? どうぞよろしくお願いいたします.

  • 「自作クラスの型」にキャストする方法について。

    「自作クラスの型」にキャストする方法について。 Java初心者ですが、よろしくお願いします。 class AAA class BBB ※クラスAAAはクラスBBBのスーパークラス(直属のスーパークラスとは限らない)とします。 class CCC という3つのクラスがあるとして、 この場合、 class CCC{ AAA var; BBB bbb; void test(){ bbb = new BBB(); var = (AAA)bbb; //---★ } } というような、キャストは可能ですよね?(←確認1) 次に(確認1に問題が無い場合)、 クラスAAAとクラスBBBの格納場所(パッケージ関連の話です)について、 AAAとBBBがどういう位置関係にあるときに、上記のキャストは可能になるのでしょうか? AAAとBBBが同一パッケージ内にある時だけでしょうか?(←確認2[質問の核]) で、さらに、 上記の「---★」の所で、 AAAクラスにキャストする処理をしていますが、 この時、AAAクラスのコンストラクタは呼ばれるのでしょうか? (AAAをnewしていないけれど、キャスト処理でnewしたのと同じことになったりしますか?) また、これと同様の質問になりますが、 仮に、クラスAAAの設計が、クラスAAAのインスタンスが生成された場合に、 何らかのコールバック処理が行われるような設計の場合、 この (AAA)bbb というキャストによって、想定しているコールバック処理 は行われたりしますでしょうか?(←確認3) 初心者らしからぬ質問かもしれませんが、 どなたか、どうか分かりやすく教えて下さい。

    • ベストアンサー
    • Java
  • 試作クラス使用C++プログラムが動かない原因

    試しに作成した以下のプログラムにビルドエラーが発生し,困っているので質問しました. コンパイラは,「BBB *b」などクラスポインタ変数の部分がエラーと指摘しているのですが(他にも数か所ありますが…),間違っている理由が分からず困ってます. ご回答,よろしくお願い致します. ----------------------------------- #include <iostream> using namespace std; class AAA { public: // コンストラクタ AAA(){ b = new BBB( this ); } // デストラクタ ~AAA(){ delete b; } // メンバ変数 BBB *b; int i; // メンバ関数 void displayB(){ b->displayA(); } }; class BBB { public: // コンストラクタ BBB( AAA *a ){ this->a = a; } // デストラクタ ~BBB(){} // メンバ変数 AAA *a; int j; // メンバ関数 void displayA(){ printf( "%d\n", a->i ); } }; int main() { // 変数の定義 AAA a; // 変数の初期化 a.i = 2; a.b->j = 5; // 出力 printf( "%d\n", a.i ); a.b->displayA(); return 0; } -----------------------------------

  • C#でthisポインタのような感じで渡したい

    こんにちは。 C#で以下のようなことをしようとしましたら 「error CS1605: 読み取り専用なので 'this' は ref または out 引数として渡せません」 とエラーが返されてしまいました。 C++ではthisポインタを渡すことができますが、C#で似たようなことをするには どのようにすればよろしいのでしようか? public class AAA {   public AAA( ref BBB a )   {   } } public class BBB {   public BBB()   {     AAA aaa = new AAA( ref this ) ;   } }

  • delete[]と、delete演算子の明確な違いとその使い分けについて

    C++の delete[]と、delete演算子の明確な違いとその使い分けについて 型* ptr = new 型[要素数]; でnewしたものについては、 delete[] ptr; にて、開放 型* ptr = new 型(); でnewしたものは、 delete ptr; するものだと、覚えてました、 特に深くは考えていなかったのですが。 std::auto_ptr<T> では、内部的には、delete[]ではなく deleteをしているという文章を見ました。 { std::autoptr<型A> iptr; iptr = new 型A; } のようなときは いいのですが・・・ { std::auto_ptr<char> cptr; cptr = new char[n+1]; } のようなときは、 動的配列なので、内部的に delete ptr; になってしまいます。 このように、テンプレートクラスを自作するときに 実際の特殊な型が決定されるまで、 deleteで、いくのかdelete[]でいくのか決定できないのはつらそうです。 そこで、deleteと、delete[]の正しい意味を 知りたいのですが。 Javaや、.NETには、配列オブジェクトというものが あります。 C++で、 new char[n+1]; は配列オブジェクトでしょうか? だとすると、delete[]は 右に来たものが配列オブジェクトなら、 Lengthを(こんなものがあるとして)調べて 1つづつ、まわして、deleteのほうを使ってひとつひとつ開放していく。 右に来たものが配列オブジェクトでなければ deleteと同じ振る舞いをする。 という動きが物理的に考えれそうで。 delete[]と書いておけば、状況に応じて、 動的配列なら全要素サーチして、開放そうでなければ deleteという風に、勝手に自動でそうしてくれるなら、 どんなときでも、delete[]にするようにコードを書いておけばよさそうです。。 実際のところどうなんでしょうか? deleteと、delete[]の明確な意味の違いと、 使用方法の違いについて教えてください。

  • deleteで開放するとエラーになる原因がわからない

    deleteでメモリ開放するとエラーになる原因がわからないです。 下記のようなプログラムを作ったのですが、deleteのところでエラーがでます。 エラー内容は 「Windows によって ****.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。****.exe または読み込まれた DLL にバグがあります。 あるいは、****.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。」 とでます。 ソースは wchar_t *aaa = L"ほげほげ"; wchar_t bbb[200]; wcscpy(bbb, aaa); delete aaa; wprintf(L"%s\n", bbb); getchar(); です。 どこに原因があるのでしょうか? [環境] WindowsXP+VisualC++2008 UNICODE使用

  • perlのマクロ演算子?について

    AAA変数にBBB配列名を代入し,AAA変数に配列を入れてBBB配列を使いたいのですが....どのようにするのでしょうか? 例 $count = 1 $AAA = "@BBB_no".$count; ※$AAA = ("ア","イ","ウ","エ"); ↑ここの※の部分に何か加えるのでしょうか?

  • [Objective-c]多次元配列のアクセス方法

    [Objective-c]多次元配列のアクセスの仕方をご教授いただきたく思います 処理文 NSLog(@"%@",[ar objectAtIndex:1]); ※arは多次元配列 コンソールの表示結果 { item1 ="aaa"; item2 ="bbb"; item3 ="ccc"; } インターネットでは多次元配列のアクセスの仕方が見当たりませんでした。 この様な表示ではなく、この中のaaa,bbb,cccをそれぞれを明示的に取得する方法は存在しますでしょうか? よろしくお願いいたします。

専門家に質問してみよう