распределение памяти для функции c_str в строковом классе - PullRequest
2 голосов
/ 30 декабря 2010

У меня есть функция-член класса, который определен ниже, скажем,

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

Hello

Не могли бы вы объяснить, почему это происходит? Спасибо

Ответы [ 5 ]

5 голосов
/ 30 декабря 2010

Скорее всего, потому что another_member.getStringMember и a - это одна и та же строка.

В этом случае на самом деле недопустимо использовать ptr после того, как строка была изменена с помощью a="hello";, потому что операции мутирования могут сделать ранее полученный указатель недействительным.

1 голос
/ 16 марта 2011

Temp std :: string из another_member.getStringElement () выходит из области видимости после выполнения строки. Изменение

char *ptr = another_member.getStringMember().c_str();

до

std::string s = another_member.getStringMember();
const char *ptr = s.c_str();
1 голос
/ 30 декабря 2010

Вам не гарантируется, что ptr по-прежнему будет использоваться после строки a="hello" (так как похоже, что это одна и та же строка). В вашем случае, поскольку Hello был меньше, а строка не передавалась, похоже, она использовала пробел повторно.

Это поведение, специфичное для реализации. Он мог легко разбиться.

1 голос
/ 30 декабря 2010

Просто из любопытства, вы звоните

x(another_member.getStringMember, fooBar);

c_str () возвращает внутренний указатель строкового объекта, который стал недействительным, как только вы измените исходную строку

0 голосов
/ 31 декабря 2010

Вы хотели сделать another_member.getStringElement().c_str() против another_member.getStringElement.c_str().

...