Как создать std::string непосредственно из массива char * без копирования?

Скажем, у меня есть массив символов, который я выделил в куче, и который я хочу преобразовать в std::string. В настоящее время я делаю следующее:

char *array = new char[size];
WriteIntoArray(array, size);
std::string mystring(array);
delete[] array;
return mystring; // or whatever

Из того, что я читал в Интернете (http://www.cplusplus.com/reference/string/string/string/), конструктор строк выполняет копию буфера, который я передаю, оставляя меня освободить буфер (позже строка освобождает свой внутренний буфер). То, что я хотел бы сделать, это выделить мой буфер, передать его в строку, а затем освободить свой буфер, когда он будет разрушен.

Вопрос инициализация std::string из char * без копирования выглядел многообещающим, но мой код основан на вызовах API ( "WriteIntoArray" в приведенном выше примере), который приходится записывать в массив символов, поэтому мне нужно создать буфер char * C-style и не может преобразовать мой код, чтобы использовать только встроенные строковые операции (что было предложено).

Есть ли какой-то стандартный способ сделать это, или я должен просто написать свой собственный класс строк (ugh)? Спасибо!

Ответы

Ответ 1

Если вы используете совместимую реализацию С++ 0x или одну из многих библиотек С++, которые гарантируют непрерывное хранилище для std::string, вы можете получить char*, который указывает прямо на хранилище, используемое вашим std::string.

Например:

std::string mystring;
mystring.resize(size);
WriteIntoArray(&mystring[0], size);
return mystring;

Возможно, вам придется подумать о нулевом терминаторе.

Ответ 2

Вы можете реализовать собственный std:: allocator, который вместо выделения новой памяти для вашей строки использует в качестве источника регион, который вы уже создали.

Затем вы должны создать экземпляр std::string с помощью распределителя.

http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement

Ответ 3

Вы не можете std::string владеть указателем и, таким образом, копировать данные в пространство, которое оно выделяет.

Что вы можете сделать:

std::string  mystring(size, ' ');
WriteIntoArray(&mystring[0], size);
return mystring; // or whatever