2016-08-10 7 views
0

nullポインタを取得したときに、MessageBoxの代わりにヌルポイントを処理して終了する方が良い方法はありますか?私の先生は、exit()を使うのは良い方法ではないと私に教えてくれました。ここに私のコードです:終了せずにヌルポインタを処理するには?

CCheckBoxUI *pCbSwitch = static_cast<CCheckBoxUI*> (pItem->FindSubControl(_T("switch"))); 
    ASSERT(pCbSwitch && "Failed to find contronl"); 
    if (pCbSwitch == nullptr) 
    { 
     MessageBox(NULL, _T("Failed to find contronl"), _T("tip"), 0); 
     exit(-1); 
    } 
+6

exitを呼び出さない場合は、終了しないでください。 –

+1

あなたは既にアサートを持っています。なぜあなたは二重チェックですか? – molbdnilo

+0

@molbdnilo私が知っているように、ASSERTはリリースで無効になるでしょう。したがって、このアサーションは無視されます。 – XHLin

答えて

4

おそらく最も安全な方法は、可能なnullポインタを無視することです。それはあなたのコントロールであり、switchという要素があることを知っているので、FindSubControlが成功するでしょう。 FindSubControl自体はそのことを知らないため、nullポインタを返す可能性があると文書化されています。

確かにバグがあるかもしれませんが、そのためにデバッグビルドでアサーションがあるのです。

1

Can pItem->FindSubControl(_T("switch"))が失敗しますか?

サブコントロールを追加または削除する機能が他にない場合を除き...コントロール名の誤字だけが致命的な場合があります。

これは「通常の動作」ではなく、デバッグバージョンがアサーションをキャッチするバグです。 バグが修正された後は、何も失敗することはないので、他のチェックは意味をなさない。

制限されていないメモリスペースにある場合は、フレームワークがコントロールを作成できない可能性があります。したがって、を取得できません。しかし、それはあなたがすでに知っている状況ですが、サブコントロールを作成しています。しかし、その場合...メッセージボックスを表示することさえ不可能になります!

いずれにしても、防衛的に正常に終了したい場合は、exitを呼び出しずに例外をスローします。あなたはそれを呼び出し元(またはメイン)でキャッチし、クリーンアップされた方法で終了することができます。

+2

*「発信者(またはメイン)にキャッチして、クリーンアップして終了することができます」* - それをキャッチして制御された方法で終了します。 – IInspectable

+0

@IInspectable:もちろんです。問題は、あなたがどれだけ「公正」になりたいのかということです。メッセージなしでシャットダウンするGUIアプリケーションは、ユーザーをWTFモードに設定します。 –

+2

制御された方法でシャットダウンしても、フィードバックなしで即時シャットダウンが行われるわけではありません。たとえば、独自の終了ハンドラ([std :: set_terminate](http://en.cppreference.com/w/cpp/error/set_terminate))を設定することができます。 Windowsでは、未処理の例外フィルタ([SetUnandledExceptionFilter](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680634.aspx))を設定し、意味のあるダンプを書き込むために例外レコードを取得することができますファイル([MiniDumpWriteDump](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680360.aspx))。 – IInspectable

関連する問題