正在使用std::string而不是char*bad

Is using std::string instead of char* bad?

本文关键字:char bad string std      更新时间:2023-10-16

我从C++开始,我不知道是使用std::string还是char*

比方说我需要连接几个字符串。我会这样做的——我认为这是最短的路。

std::string data = "some data";
const char *result = std::string("start" + data + "end" + "something else").c_str();

问题是:我应该这样做还是使用strcpy()strcat()等c函数。?使用std::string是否比使用char*更慢、更低效?

感谢

const char *result = std::string("start" + data + "end" + "something else").c_str();是一种灾难

分配的右手使用了一个匿名的临时指针,并将留下一个悬空指针result

std::string data = "some data";转换为char* data = "some data";的想法并没有强调这样一个事实,即从std::string转换后的"某些数据"将成为只读存储器data所指向的存储器的修改是未定义的行为。至少要使用一个const char*,这样在这样的尝试中编译就会失败。

如果使用std::string,所有这些问题都会消失。这就是你的答案。它大大简化了事情。

正如许多人在评论中所说,始终使用std::string。它几乎在所有方面都优于null-terminated字符串(C/char*string)。

然而,您在示例中使用字符串的方式是不正确的,并且涉及未定义的行为。

const char *result = std::string("start" + data + "end" + "something else").c_str();

在这一行中,您创建了一个临时string。我希望您知道,临时变量只会持续到行的末尾(至少就本例而言)。因此,在这一行之后,string将不再存在。string在堆上有一个内部数组,它在其中存储其string。函数string::c_str()返回指向该数组的第一个字符的指针。但是,由于字符串对象在行的末尾被破坏,指针结果将指向内存的已删除部分,访问它是未定义的行为。

std::string data = "some data";
std::string bigData("start" + data + "end" + "something else");
const char *result = bigData.c_str();

如果您这样编写代码,那么就没有未定义的行为,因为result的生存期比字符串bigData短。