ページ 11

デストラクタについて確認したいのですが

Posted: 2009年8月02日(日) 17:08
by dic
以下のようなコードがありますが
基本クラスでデストラクタを宣言、実装してない場合
それを派生したクラスをdeleteするとき、デクトラクタが呼ばれませんが
これはこれで 正しかったのでしょうか?
#include	<stdio.h>

class	CBase
{
public:
	virtual	void	Show();
};

void	CBase::Show()
{
	printf( "CBase::Show.\n" );
}

class	CDev	:	public	CBase
{
public:
	CDev();
	~CDev();
	void	Show();
};

CDev::CDev()
{
	printf( "CDev construct.\n" );
}
CDev::~CDev()
{
	printf( "CDev destruct.\n" );
}
void	CDev::Show()
{
	printf( "CDev::Show.\n" );
}

void	main()
{
	CBase	*obj = new CDev;

	obj->Show();

	delete obj;
}

Re:デストラクタについて確認したいのですが

Posted: 2009年8月02日(日) 17:14
by たかぎ
改善点は少なくとも二つあります。

1. CBaseクラスに仮想デストラクタがない。
2. mainの返却値型がvoidなので、未定義の動作を引き起こしている。

Re:デストラクタについて確認したいのですが

Posted: 2009年8月02日(日) 17:37
by ねこ
意図が分かりませんが、ソース上では正しい動作です。

CBaseのポインタでインスタンスを受け取っているのでdeleteすれば当然CBaseのデストラクタが実行されます。
CDevクラスのデストラクタを実行したいのであれば以下のようにします。

1.たかぎさんの1番にあるようにCBaseのデストラクタにはvirtual定義を付ける
2.delete (CDev*)(obj);というようにキャストしてからdeleteを実行する

Re:デストラクタについて確認したいのですが

Posted: 2009年8月02日(日) 17:48
by dic
なるほど
表現を変えると基本クラスで仮想デストラクタがない場合の動作としては正しいか?
と言った方がよかったかもしれません

回答ありがとうございました

Re:デストラクタについて確認したいのですが

Posted: 2009年8月02日(日) 19:36
by YuO
解決となっていますが,
> 基本クラスで仮想デストラクタがない場合の動作としては正しいか?
その場合,未定義の振る舞いとなります。
なので,根本的に「正しい動作」の定義が存在しません。