Как поместить массив символов в std :: string

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

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

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

Edit1:

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


person itun    schedule 10.02.2012    source источник
comment
МБ, кто-нибудь знает другую реализацию контейнера для массива символов, с которой я могу это сделать? _1 _...   -  person ildjarn    schedule 11.02.2012


Ответы (4)


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

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

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

person Mr Lister    schedule 10.02.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, которую большинство стандартных реализаций библиотеки реализовали в течение многих лет, поэтому она вероятно безопасна, но в конечном итоге зависит от реализации.

person ildjarn    schedule 10.02.2012
comment
Это не работает. Когда я это сделал, в моем приложении произошла фатальная ошибка. - person itun; 10.02.2012
comment
@itun: Тогда вы, очевидно, используете одну из тех реализаций, которые не относятся к C ++ 11, о которых я говорил. ; -] - person ildjarn; 10.02.2012
comment
Я знаю, что использую последний MinGW без флага поддержки C ++ 11. - person itun; 10.02.2012

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

person Stuart Golodetz    schedule 10.02.2012
comment
Вы имеете в виду value вместо required. Но это не сработает. буфер std :: string доступен только для чтения. - person Mr Lister; 10.02.2012
comment
+1, но я предполагаю, что вы имеете в виду вместо передачи value в функцию. - person rasmus; 10.02.2012
comment
@MrLister Строка не доступна только для чтения, если она не объявлена ​​как const. Преобразование из & s [0] в char * в порядке. - person rasmus; 10.02.2012
comment
Хм, мне придется провести серьезное тестирование и поиск в Интернете. - person Mr Lister; 10.02.2012
comment
Да, я имел в виду value, не концентрируюсь, извините. - person Stuart Golodetz; 10.02.2012
comment
@rasmus: &s[0] является char*, конверсии нет. - person ildjarn; 10.02.2012
comment
Я немного поискал и обнаружил, что это возможно, но не рекомендуется передавать адрес строкового буфера функции. См. Мой отредактированный ответ. - person Mr Lister; 11.02.2012

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

std::string s(charArry);
person Sid    schedule 10.02.2012