正在使用std::string而不是char*bad
Is using std::string instead of char* bad?
我从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
短。