[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>
#include <string>
void Print( const std::string& str )
{
printf( "%s\n", str.c_str() );
}
int main()
{
Print( NULL );
return 0;
} |
実現したかったのはコンパイル時のエラーチェックだったはずなのに
引数がconst char*だった時と何も変わっていません。
結局、文字列を安全に渡すことは出来ないのです…
オブジェクトの参照はコンストラクタの実装により危険性があるので過信せずご利用は計画的に… |
|