プロが教える店舗&オフィスのセキュリティ対策術

こんにちは

配列を使った際、うまいことDeleteが働いてくれないため
メモリが開放されずに困っています、
初歩的な質問で申し訳ありませんが、質問させて下さい。

下記のプログラムでは、
単純にメモリ確保とメモリ開放を行っていると思うのですが…
注釈にもあるように、Deleteでメモリが開放されません。

#include <iostream>
using namespace std;

class Base
{
};

class Sub : public Base
{
char size[256];//領域確保用
};

void main()
{
Base* obj[10000];

for(int cnt=0;cnt<10000;cnt++)
{
obj[cnt] = new Sub;
}

for(int cnt=0;cnt<10000;cnt++)
{
delete obj[cnt];//メモリが開放されない
}

}

ポインタが怪しいと思うのですが、
どうにかうまいことメモリを開放することは出来ないでしょうか。
よろしければ返答お願いいたします。

A 回答 (1件)

正しくdeleteするためには,deleteされるオブジェクトの静的な型 (今回ではBase) にvirtualの付いたデストラクタがないといけません。


そうでない場合,deleteされるオブジェクトの静的な型とnewした型 (今回ではSub) が異なる場合は未定義動作とされています。
    • good
    • 0
この回答へのお礼

なるほど、調べてみれば、スーパークラスのデストラクタには
Virtualを付けておいた方が良いようですね。
そうしないとスーパークラスのデストラクタだけが実行されるようですね…。

ありがとうございました

お礼日時:2009/06/27 14:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!