私は小さなプロジェクトに取り組んでいて、次のような状況になりました。
std::string myString;
#GetValue() returns a char*
myString = myObject.GetValue();
私の質問は、GetValue()
returnsNULLmyString
が空の文字列になるかどうかです。未定義ですか?またはそれはセグメンテーション違反になりますか?
私は小さなプロジェクトに取り組んでいて、次のような状況になりました。
std::string myString;
#GetValue() returns a char*
myString = myObject.GetValue();
私の質問は、GetValue()
returnsNULLmyString
が空の文字列になるかどうかです。未定義ですか?またはそれはセグメンテーション違反になりますか?
興味深い小さな質問です。C++11 標準によると、sect. 21.4.2.9、
basic_string(const charT* s, const Allocator& a = Allocator());
必須: s は null ポインターであってはなりません。
標準では、この特定の要件が満たされていない場合にライブラリに例外をスローするように要求しないため、null ポインターを渡すと未定義の動作が引き起こされたように見えます。
実行時エラーです。
これを行う必要があります:
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
ます。
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.