我有一个类的成员函数,如下所述,比如说
int x(std::string &a, std::string &b) {
char *ptr = another_member.getStringMember().c_str() //I am storing the pointer
cout << ptr << endl;
a="hello";
cout << ptr << endl;
}
输出
StringMember
您好
你能解释一下为什么会这样吗?感谢
答案 0 :(得分:5)
很可能因为another_member.getStringMember
和a
是相同的字符串。
在这种情况下,在使用ptr
修改字符串后使用a="hello";
实际上并不合法,因为变异操作会使先前获得的指针无效。
答案 1 :(得分:1)
出于好奇,你打电话给
x(another_member.getStringMember, fooBar);
c_str()返回字符串对象的内部指针,一旦修改源字符串
,它就会变为无效答案 2 :(得分:1)
您不能保证ptr在a="hello"
行之后仍然可用(因为看起来它们是相同的字符串)。在你的情况下,因为Hello较小,并且字符串没有被共享,所以看起来它重用了空间。
这是特定于实现的行为。它可能很容易崩溃。
答案 3 :(得分:1)
执行该行后,来自another_member.getStringElement()的temp std :: string超出范围。变化
char *ptr = another_member.getStringMember().c_str();
到
std::string s = another_member.getStringMember();
const char *ptr = s.c_str();
答案 4 :(得分:0)
你的意思是another_member.getStringElement().c_str()
而不是another_member.getStringElement.c_str()
。