Reputation: 3521
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
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
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
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
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