4

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?

itun
  • 3,439
  • 12
  • 51
  • 75
  • "*MB somebody know another container implementation for char array with which I can do that?*" `std::vector`... – ildjarn Feb 10 '12 at 22:27

4 Answers4

6

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.

ildjarn
  • 62,044
  • 9
  • 127
  • 211
3

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

Stuart Golodetz
  • 20,238
  • 4
  • 51
  • 80
2

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.

Community
  • 1
  • 1
Mr Lister
  • 45,515
  • 15
  • 108
  • 150
0

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);
Stuart Golodetz
  • 20,238
  • 4
  • 51
  • 80
Sid
  • 7,511
  • 2
  • 28
  • 41