- ベストアンサー
基本クラスポインタ = new 派生クラス[i];
基本クラスのポインタ変数pbaseを宣言し、new演算子にて派生クラスの配列を動的に確保して、pbaseに代入した場合、delete[] pbaseは上手く動作するのでしょうか。 (Aのデストラクタは仮想関数にしてあるとしておきます) ------ex-start------ class A {}; class b:public A{}; main() { A * pbase pbase = new B[5]; delete[] pbase } ------ex-end------ 例えば、 class Aは12バイト class Bは20バイト である場合、配列のサイズが違うのに、delete[]でちゃんと開放されるのでしょうか。 それともnew/deleteは確保したサイズをシンボル毎に記憶しているのでしょうか。 どうもこの辺が曖昧で実装する時にあやふやになってしまいます。どなたかお知恵をお貸しくださいませ。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (2)
- JustyLight
- ベストアンサー率0% (0/1)
回答No.2
- graphaffine
- ベストアンサー率23% (55/232)
回答No.1
お礼
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-07.html 7.26に有りました。 メモリが動的に確保された時はそのブロックサイズが記憶されていると予測できます。 と言う事は、ポインタの値が同じならば開放されると言う事っぽいです。その辺は保証されているか不明ですが。 ともかく疑問が消えましたありがとうございます。
補足
私も、同じような事が出来る事を確認しました。 派生クラスに別のクラスのオブジェクトをメンバとして持たせて、そのデストラクタが呼ばれるかどうかと言うやり方でしたが。 結果は、開放されますね。 初歩的な質問になるのでしょうけれども、free()/deleteで「ポインタ」しか渡しませんよね。 確保されているサイズは渡していないのですが、これってmalloc()/newの時にどこかに記録されてるって事なんですかね。