使用std :: string而不是char * bad?

时间:2015-11-27 12:37:24

标签: c++ string

我从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::stringchar*更慢,效率更低吗?

由于

2 个答案:

答案 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短。