はてな住民が増えて嬉しいおいらはついスグに内容に突っ込んじゃうの

mixi から はてなへようこそ!(ぉ > id:NetSeed さん

先日、はてなに別荘を創られたというお話をお聞きし、速RSSを購読しておいたおかげでスグに記事が読めましたよ!

その昔私もやりました

さて、記事を見させて頂いて、危険なコードを発見してしまったので早速ツッコミ。(ぉ (もはや魔法使ってる気分 - 時計屋の雑記帳 より)

class CountableObjectBase
{
private:
	int _RefCount;

public:
	(略)
	int Release()
	{
		if(0==--_RefCount)
		{
			delete this;
		}
		return _RefCount;
	}

(以下略)


delete this; してしまうと、this が不正になりますので return _RefCount; (つまりは "return this->_RefCount") へのアクセスが未定義になってしまい、いわゆる「鼻から悪魔」状態にあります。

なので、そのうち赤いバッテンにお世話になるかもしれませんし、将来的にもうごいちゃうかもしれません。 はたまた、3分後に突然専属メイドさんがお家に現れるかもしれませんし、ディスプレイから嫁がにゅっと出てくるかもしれませんし、振り返ってみたらいつの間にか後ろに「中央の薔薇の装飾が印象的なアンティークケース」が置いてるかもしれません。 未定義最高じゃないか! (泣きながら



なもんで、delete した後に this にアクセスしないようなコードにして正当なコードにしなくてはなりません。(鞄が現れる可能性が0になってしまう事が大変残念でなりません。)

私はどうしていたかなぁ…その時の気分によりますが以下のような感じ…?

int Release()
{
	int n = _RefCount;
	if(--n == 0)
		delete this;
	else
		_RefCount = n;
	return n;
}

int Release()
{
	if(--_RefCount != 0)
		return _RefCount;

	delete this;
	return 0;
}


まぁあと、重箱の隅をつついちゃう感じですごい嫌ではあるんですけれども^^;、識別子として _[A-Z].+ベンダー向けの予約語 ですね………といいつつ、私はインクルードガードで

#ifndef _KANARIA_
#define _KANAIRA_

class Kanaria{};

#endif // _KANARIA_

とかやっちゃってますけれども…(ぉ ^^;




ちなみに、個人的には C#C++ との対比が大変勉強になります。 「フォームにボタン配置して、ダブルクリックだけでボタンプッシュメソッドが実装できたー!わーい!」 程度でしかまだ使えて居ない身ですからね > 期待してます :-]