melt日記

.NETすらまともに扱えないへたれのページ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  111  : 記事  3  : コメント  8268  : トラックバック  41

ニュース

わんくま同盟

わんくま同盟

C# と VB.NET の質問掲示板

iKnow!


Dictation



書庫

とある関数の中身を見てみると、面白いメソッドがありました。

void Func(HogeProxy* pHogeProxy)
{
    HogeFunc(pHogeProxy->GetHoge());
}
void HogeFunc(Hoge* pHoge)
{
    // pHoge を使ってほげほげする
    // pHoge は NULL でも構わない
}

proxy クラスを使って HogeFunc にアクセスしているだけです。

しかし、HogeFunc() の説明に NULL が入っていても構わないという記述があるので、pHogeProxy が NULL の場合のチェックが必要です。

つまり、

void Func(HogeProxy* pHogeProxy)
{
    HogeFunc(pHogeProxy == NULL ? NULL : pHogeProxy->GetHoge());
}

こうする必要があるのです。

が、pHogeProxy は NULL チェックを行っていません。

これは不具合か?と思ったのですが、念のため HogeProxy::GetHoge() の中身を見てみると……

Hoge* HogeProxy::GetHoge()
{
    this == NULL ? NULL : m_pHoge;
}

this が NULL かどうかをチェックするなんて……こんな書き方ありかYO!

投稿日時 : 2007年9月9日 21:42

コメント

# re: [C++]proxy の null チェック 2007/09/09 21:48 επιστημη
んー...仮想関数でないことが確実なら一概にナシとは言い切れづ。

# re: [C++]proxy の null チェック 2007/09/09 23:32 シャノン
典型的な処理系の実装の話としては、メンバ関数とは、第一引数に this を取る普通の(非メンバ)関数と考えられ、関数の実体はインスタンスごとに存在するわけではないから、メンバ変数にアクセスさえしなければ、this が NULL であってもメンバ関数を呼ぶことはできる、となる。
# MFC の CWnd::GetSafeHwnd なんかはこのカラクリ。
仮想関数の場合、関数のアドレスを決定するためのポインタテーブルがインスタンスごとに存在するから、this == NULL の場合は、そう書いても、GetHoge が呼び出される前にヌルポでガッされるということに。

ま、規格的にどうなのかは知らんけど。

# re: [C++]proxy の null チェック 2007/09/10 1:38 melt
実はとある関数というのは CWnd::GetSafeHwnd() のことだったりw

実際に出来るってことは分かっていますが、でもやっぱり delete this ぐらいの違和感はありますw

# re: [C++]proxy の null チェック 2007/09/10 8:11 デフォルトの名無しさん
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232

# re: [C++]proxy の null チェック 2007/09/10 12:33 melt
すみません、英語に不自由してるので誰か翻訳お願いします……orz

# re: [C++]proxy の null チェック 2007/09/10 20:59 さかもと
小学生計算ができていないさかもとです。
恥を忍んでご挨拶に参りました・・・(笑)
今後とも宜しくお願いいたします。


# re: [C++]proxy の null チェック 2007/09/10 21:25 melt
中学生英語ができてない melt です。
恥なんてとっくの昔に捨ててますw
今後ともよろしくお願いしますm(__)m

Post Feedback

タイトル
名前
Url:
コメント