35

私は小さなプロジェクトに取り組んでいて、次のような状況になりました。

std::string myString;
#GetValue() returns a char*
myString = myObject.GetValue();

私の質問は、GetValue() returnsNULLmyStringが空の文字列になるかどうかです。未定義ですか?またはそれはセグメンテーション違反になりますか?

4

3 に答える 3

62

興味深い小さな質問です。C++11 標準によると、sect. 21.4.2.9、

basic_string(const charT* s, const Allocator& a = Allocator());

必須: s は null ポインターであってはなりません。

標準では、この特定の要件が満たされていない場合にライブラリに例外をスローするように要求しないため、null ポインターを渡すと未定義の動作が引き起こされたように見えます。

于 2012-05-27T05:48:21.823 に答える
13

実行時エラーです。

これを行う必要があります:

myString = ValueOrEmpty(myObject.GetValue());

は次のようにValueOrEmpty定義されます。

std::string ValueOrEmpty(const char* s)
{
    return s == nullptr ? std::string() : s;
}

または、次のように返すこともできますconst char*(そのほうが理にかなっています)。

const char* ValueOrEmpty(const char* s)
{
    return s == nullptr ? "" : s; 
}

を返すconst char*と、呼び出しサイトで に変換されstd::stringます。

于 2012-05-27T05:46:35.920 に答える
7

My question is if GetValue() returns NULL myString becomes an empty string? Is it undefined? or it will segfault?

It's undefined behavior. The compiler and run time can do whatever it wants and still be compliant.

于 2012-05-27T05:51:06.393 に答える