のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

C++ デストラクタが呼ばれるタイミング

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。というか腹いてぇ

さて、今日はデストラクタが呼ばれるタイミングについて
知ってる人は当たり前ですが、変数にオブジェクトを突っ込んだものとnewしてポインタに入れたものでは挙動が異なります。

言っていることが意味不明かもしれないので、少し実際に検証します。

やりたいことは、new したらdeleteしろと言われます。ぶっちゃけスコープから出たら解放されるんじゃないの?っていうのを比較しましょうということです。ソースコードは以下の通り

#include <iostream>

using namespace std;

class Foo{
public:
	Foo(){
		cout << "call constructor" << endl;
	}

	~Foo(){
		cout << "call destructor" << endl;
	}
};

void callVariable(){
	Foo foo;
}

void callPointerNoDestructor(){
	Foo *foo = new Foo();
}

void callPointerDestructor(){
	Foo *foo = new Foo();
	delete foo;
}

int main(void){
	cout << "variable start" << endl;
	callVariable();
	cout << "variable finish" << endl;

	cout << "pointer start(no delete)" << endl;
	callPointerNoDestructor();
	cout << "variable finish(no delete)" << endl;

	cout << "variable start" << endl;
	callPointerDestructor();
	cout << "variable finish" << endl;
}

実際にこれを動作させてみると以下のような内容になるかと思います。

variable start
call constructor
call destructor
variable finish
pointer start(no delete)
call constructor
pointer finish(no delete)
pointer start
call constructor
call destructor
pointer finish

何やら一つだけデストラクタが呼ばれていないのがあると思ったらdeleteが呼ばれていないものだった・・・・。
これがどういうことかといいますと、ポインタとしてアドレス持ってるけど、指している変数だけ解放されて指し示している先は解放されていないことを指します。

要はうっかりしてしまうと、原因不明のメモリ食い過ぎ泣きそうとかになるわけです。

ということで皆さん気をつけてくださいな…。