C++プログラマ キャスブログ
[C++]std::stringの華麗な罠 2014年11月28日23:05:57
文字列を関数の引数に渡す場合こんなコードを思い浮かべるのではないでしょうか?
1 2 3 4 void Print( const char* str ) { printf( "%s\n", str ); }
書いた後、こう思うはずです。あれ、NULL渡されたらヤバくない? その通りです。 NULLが渡されたら落ちます。 NULLを許容したい訳じゃないので、NULLチェックを入れるのは面倒だ。 std::stringを利用して参照にしたら完璧じゃない?と閃くはずです。
1 2 3 4 void Print( const std::string& str ) { printf( "%s\n", str.c_str() ); }
しかしながら、こいつは完璧じゃありません。 std::stringは文字列のポインタを受け付けている為にNULLを受け取れるのです(涙) 下記のコードはコンパイルが通り実行時に落ちます。 ※落ちるタイミングはstd::stringのコンストラクタです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <cstdio> // printfに必要なヘッダー #include <string> // std::stringに必要なヘッダー void Print( const std::string& str ) { printf( "%s\n", str.c_str() ); } int main() { // C++11の場合はNULLでなくnullptrを使いましょう。 Print( NULL ); return 0; }
実現したかったのはコンパイル時のエラーチェックだったはずなのに 引数がconst char*だった時と何も変わっていません。 結局、文字列を安全に渡すことは出来ないのです… オブジェクトの参照はコンストラクタの実装により危険性があるので過信せずご利用は計画的に…
カテゴリ

リンク
C++11のコードを
試すのに便利です。
http://ideone.com/

同人ゲームを
製作している知人
sorcery

にほんブログ村 IT技術ブログ C/C++へ
にほんブログ村


C++ ブログランキングへ

ゲームダウンロード DefenceTri