将char添加到字符串并删除char数组

时间:2019-03-18 09:38:03

标签: c++

是否将char中的char*添加到std::string,然后delete[] char数组会导致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?

5 个答案:

答案 0 :(得分:5)

push_back函数的定义是

void push_back( CharT ch );    

由于参数ch是通过值而不是通过引用传递的,因此它将被复制到字符串中,因此删除添加到字符串的char的源不会引起任何问题。

答案 1 :(得分:5)

创建字符串后删除即可,因为push_back复制了数据。但是,更好的方法是简单地使用:

std::string data(buffer, buffer_size);

在循环中调用push_back可能会多次触发内存分配。但是,借助构造函数,整个buffer_size内存会立即分配。

答案 2 :(得分:3)

您可以从std::string::push_back的签名中看到

 void push_back( CharT ch );

复制函数参数。因此,将拥有char的所有资源复制后删除到某个字符串中都是可以的。

请注意,您也可以避免手动循环

data.insert(data.end(), buffer, buffer + buffer_size);

答案 3 :(得分:3)

是的,可以将char从缓冲区复制到数据,因此复制完成后,两个变量之间没有链接。另外,您应该考虑将char *复制到字符串的更有效的选择,例如,这个http://www.cplusplus.com/reference/string/string/operator+=/

答案 4 :(得分:2)

很安全。但您也可以使用std :: string :: append(const char * s,size_t n);