itun
itun

Reputation: 3521

How to put char array into std::string

I allocate a char array then I need to return it as a string, but I don't want to copy this char array and then release its memory.

        char* value = new char[required];
        f(name, required, value, NULL); // fill the array
        strResult->assign(value, required);
        delete [] value;

I don't want to do like above. I need put the array right in the std string container. How I can do that?

Edit1:

I understood that I should not and that the string is not designed for this purpose. MB somebody know another container implementation for char array with which I can do that?

Upvotes: 4

Views: 3295

Answers (4)

Mr Lister
Mr Lister

Reputation: 46549

You shouldn't. std::strings were not designed to expose their internal data to be used as a buffer.
It's not guaranteed that the string's buffer address won't change during execution of an external function, especially not if the function allocates or deallocates memory itself.
And it's not guaranteed that the string's buffer is contiguous.

See, for example, here.

The example in your post is the better way to do it.

Upvotes: 2

ildjarn
ildjarn

Reputation: 62975

In C++11, the following is guaranteed to work:

std::string strResult(required, '\0');
f(name, required, &strResult[0], NULL);

// optionally, to remove the extraneous trailing NUL (assuming f NUL-terminates):
strResult.pop_back();

return strResult;

In C++03 that's not guaranteed to work, but it is addressed by Library Issue 530 which most standard library implementations have had implemented for years, so it's probably safe, but ultimately is implementation-dependent.

Upvotes: 6

Sid
Sid

Reputation: 7631

You're gonna have to copy it to a string. AFAIK std::string does not let you access it's internals directory to do any sort of an address based direct assignment.

std::string s(charArry);

Upvotes: 0

Stuart Golodetz
Stuart Golodetz

Reputation: 20616

Instead of passing value into the function, pass in &s[0], where s is a std::string of the right length.

Upvotes: 3

Related Questions