我从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*
更慢,效率更低吗?
由于
答案 0 :(得分:9)
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
,所有这些问题都会消失。有你的答案。它大大简化了事情。
答案 1 :(得分:4)
许多人已在评论中说过,请始终使用std::string
。几乎在所有方面都优于null-terminated
字符串(C / char *字符串)。
但是,在示例中使用字符串的方式不正确并且涉及未定义的行为。
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
短。