Как поместить массив char в std :: string - PullRequest
4 голосов
/ 10 февраля 2012

Я выделяю массив символов, затем мне нужно вернуть его в виде строки, но я не хочу копировать этот массив символов и затем освобождать его память.

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

Я не хочуделай как вышеМне нужно поместить массив прямо в контейнер строки std.Как я могу это сделать?

Edit1:

Я понял, что не должен и что строка не предназначена для этой цели.МБ, кто-нибудь знает другую реализацию контейнера для массива char, с помощью которой я могу это сделать?

Ответы [ 4 ]

5 голосов
/ 10 февраля 2012

В C ++ 11 гарантированно работает следующее:

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;

В C ++ 03 это не гарантированно для работы, но оно решается Выпуск библиотеки 530 , который большинство стандартных реализаций библиотек реализовывалось годами, поэтому вероятно, безопасно, но в конечном итоге зависит от реализации.

3 голосов
/ 10 февраля 2012

Вместо передачи value в функцию, введите &s[0], где s - это std::string правильной длины.

2 голосов
/ 10 февраля 2012

Ты не должен. std::strings не были предназначены для предоставления своих внутренних данных для использования в качестве буфера.
Не гарантируется, что адрес буфера строки не изменится во время выполнения внешней функции, особенно если функция сама выделяет или освобождает память.
И не гарантируется, что буфер строки является смежным.

См., Например, здесь .

Пример в вашем посте - лучший способ сделать это.

0 голосов
/ 10 февраля 2012

Тебе придется скопировать его в строку.AFAIK std :: string не позволяет получить доступ к его внутреннему каталогу для выполнения какого-либо прямого назначения на основе адреса.

std::string s(charArry);
...