ClydeTheGhost
ClydeTheGhost

Reputation: 1523

Return a local C-string for function with C++ string return value

The following piece of code compiles and runs without errors and with the expected output:

#include <string>
#include <iostream>
using namespace std;

string getString()
{
    char s[] = "Hello world!";
    return s;
}

int main()
{
    cout << getString() << endl;
}

My question is, will this always work? Ordinarily if you return a C-string that was declared locally you can run into some undefined behavior, but in this case is that still a problem since it is run through the string constructor and (presumably) copied into dynamic memory?

Upvotes: 6

Views: 1576

Answers (1)

user4442671
user4442671

Reputation:

 return s;

That line is equivalent to:

return std::string(s);

And that will make a copy of the string, so it's fine.

reference: http://en.cppreference.com/w/cpp/string/basic_string/basic_string (constructor #5)

Constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s.

Edit: One more detail. You mention

copied into dynamic memory?

And the answer is maybe, perhaps, it doesn't really matter.

The semantics provided by std::string make no specification towards this, it just guarantees that it can be copied/moved around and accessed in a consistent matter. How it acheives this is up to the library implementor.

In fact, popular implementations of std::string use something called the "Small String Optimization". Where strings under a certain length are stored within the string object itself.

Upvotes: 13

Related Questions