将char添加到String并删除char数组

问题描述 投票:4回答:5

是从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?
c++
5个回答
5
投票

push_back函数的定义是

void push_back( CharT ch );    

由于参数ch是按值传递而不是通过引用传递的,因此将其复制到字符串中,因此删除附加到字符串的字符的源不会导致任何问题。


5
投票

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

std::string data(buffer, buffer_size);

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


3
投票

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

 void push_back( CharT ch );

函数参数被复制。因此,在将char复制到某个字符串后删除任何拥有data.insert(data.end(), buffer, buffer + buffer_size); 的资源都可以。

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

http://www.cplusplus.com/reference/string/string/operator+=/

3
投票

是的,它很好,导致你将字符从缓冲区复制到数据,因此复制完成后两个变量之间没有链接。另外你应该考虑将char *复制到字符串的更有效的选项,例如这一个qazxswpoi


2
投票

它是安全的。但是你也可以使用std :: string :: append(const char * s,size_t n);

© www.soinside.com 2019 - 2024. All rights reserved.