#c
#c
Вопрос:
Может ли добавление a char
из a char*
в a, std::string
а затем delete[]
массив символов вызвать UB?
или безопасно обрабатывать строку после delete[]
?
int buffer_size = 4096;
char* buffer = new char[buffer_size];
//here there was removed code that assign values to the buffer[i]
std::string data;
for (int i = 0; i < buffer_size ; i )
{
data.push_back(buffer[i]);
}
delete[] buffer;
//is the data string content secured at this point?
Комментарии:
1. Нет, это совершенно нормально.
Ответ №1:
Определение функции push_back является
void push_back( CharT ch );
Поскольку параметр ch передается по значению, а не по ссылке, он копируется в строку, поэтому удаление источника символа, который вы добавили к строке, не вызывает никаких проблем.
Ответ №2:
Удаление после создания строки выполняется нормально, так как push_back
данные копируются. Однако лучшим методом является использование простого:
std::string data(buffer, buffer_size);
Вызов push_back
в цикле может вызвать выделение памяти несколько раз. Но с конструктором сразу выделяется вся buffer_size
память.
Ответ №3:
Это безопасно. Но вы также можете использовать std::string::append(const char*s , size_t n);
Ответ №4:
Вы можете видеть из подписи std::string::push_back
void push_back( CharT ch );
что аргумент функции скопирован. Следовательно, удаление любого ресурса, которому принадлежал char
после того, как он был скопирован в некоторую строку, является нормальным.
Обратите внимание, что вы также можете избежать ручного цикла, выполнив
data.insert(data.end(), buffer, buffer buffer_size);
Ответ №5:
да, все в порядке, потому что вы копируете символы из буфера в данные, поэтому после завершения копирования связь между двумя переменными отсутствует. Также вам следует рассмотреть более эффективный вариант копирования символа char * в строку, например, этотhttp://www.cplusplus.com/reference/string/string/operator =/