📘

C++のstd::stringの初期化とNULLポインタの取り扱い

2024/08/02に公開

C++での文字列操作は std::string クラスを使用することで容易になりますが、初期化時にCスタイルの文字列(const char*)を使用する場合、特にそのポインタが NULL の場合には注意が必要です。この記事では、std::string の初期化方法と、初期化データが NULL の場合の挙動について詳しく解説します。

std::stringの初期化

std::string はC++の標準ライブラリの一部で、動的にサイズが変更可能な文字列を扱います。通常、std::string は以下のように初期化されます。

const char* example_c_str = "example";
std::string example_string(example_c_str);

この例では、Cスタイルの文字列 example_c_str を使用して std::string オブジェクト example_string を初期化しています。

NULLポインタが渡された場合の挙動

Cスタイルの文字列を指すポインタが NULL の場合、std::string のコンストラクタに渡すとどうなるのでしょうか?

const char* null_c_str = NULL;
std::string null_string(null_c_str);

このコードは、実行時に例外を引き起こします。具体的には、std::string のコンストラクタは NULL が渡された場合に std::logic_error (通常は std::invalid_argument)をスローします。これは、std::string コンストラクタが内部で NULL ポインタのチェックを行い、有効なメモリアドレスを期待しているためです。

安全な初期化のためのチェック

NULL ポインタが渡される可能性がある場合、std::string を初期化する前にこれをチェックすることが重要です。

const char* input_c_str = get_input(); // NULLを返す可能性がある関数
if (input_c_str != NULL) {
    std::string safe_string(input_c_str);
} else {
    std::cerr << "Error: NULL pointer received." << std::endl;
}

このように安全チェックを行うことで、例外を防ぎアプリケーションの安定性を保つことができます。

まとめ

std::string の初期化には通常、Cスタイルの文字列が使用されますが、これが NULL の場合には例外が発生します。安全なプログラミングのためには、ポインタが NULL でないことを確認することが推奨されます。

Discussion