Добавить символ char в строку и удалить массив символов

#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 =/