Как создать std :: string непосредственно из массива char * без копирования? - PullRequest
18 голосов
/ 15 июля 2011

Скажем, у меня есть массив символов, которые я выделил в куче, и которые я хочу преобразовать в 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 и не могу преобразовать свой код, чтобы использовать только встроенные строковые операции (что и было предложено):

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

Ответы [ 3 ]

16 голосов
/ 15 июля 2011

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

Например:

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

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

12 голосов
/ 31 июля 2012

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

Затем вам следует создать экземпляр std :: stringраспределитель.

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

5 голосов
/ 15 июля 2011

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

Что вы могли бы сделать:

std::string  mystring(size, ' ');
WriteIntoArray(&mystring[0], size);
return mystring; // or whatever
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...