bardes
bardes

Reputation: 770

Assign a nullptr to a std::string is safe?

I was working on a little project and came to a situation where the following happened:

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

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

Upvotes: 44

Views: 36346

Answers (4)

康桓瑋
康桓瑋

Reputation: 43146

Update:

Since C++23 adopted P2166, it is now forbidden to construct std::string from nullptr, that is, std::string s = nullptr or std::string s = 0 will no longer be well-formed.

Upvotes: 10

thb
thb

Reputation: 14464

Interesting little question. According to the C++11 standard, sect. 21.4.2.9,

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

Requires: s shall not be a null pointer.

Since the standard does not ask the library to throw an exception when this particular requirement is not met, it would appear that passing a null pointer provoked undefined behavior.

Upvotes: 73

Sarfaraz Nawaz
Sarfaraz Nawaz

Reputation: 361792

It is runtime error.

You should do this:

myString = ValueOrEmpty(myObject.GetValue());

where ValueOrEmpty is defined as:

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

Or you could return const char* (it makes better sense):

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

If you return const char*, then at the call-site, it will convert into std::string.

Upvotes: 15

David Hammen
David Hammen

Reputation: 33136

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.

Upvotes: 9

Related Questions