字符串类中c_str函数的内存分配

时间:2010-12-30 16:57:28

标签: c++ string memory-management

我有一个类的成员函数,如下所述,比如说

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

     

您好

你能解释一下为什么会这样吗?感谢

5 个答案:

答案 0 :(得分:5)

很可能因为another_member.getStringMembera是相同的字符串。

在这种情况下,在使用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()