Skąd wskaźnik zwracany przez wywołanie ciąg :: c_str() wskazuje na? W poniższym fragmencie kodu pomyślałem, że dam mu błąd segmentacji, ale daje mi poprawne wyniki. Jeśli wskaźnik zwrócony przez ciąg :: c_str() wskazuje na wewnętrzną lokalizację wewnątrz obiektu napisowego, to po wywołaniu funkcji i wywołaniu destruktora obiektu powinienem uzyskać niepoprawny dostęp do pamięci.ciąg :: c_str zapytanie
#include <iostream>
#include <string>
using namespace std;
const char* func()
{
string str("test");
return str.c_str();
}
int main()
{
const char* p = func();
cout << p << endl;
return 0;
}
Output: test
Compiler: g++ 4.3.3
Platform: ubuntu 2.6.28-19
AFAICT, wskaźnik zwrócony przez 'c_str()' jest ważny do następnego wywołania funkcji niestałej. Ponieważ 'c_str()' i 'data()' są obydwoma "stałymi", nie mogą unieważnić wcześniej zwróconych wskaźników. – MSalters
@MSalters: Tak myślałem, ale: "Referencje, wskaźniki i iteratory odnoszące się do elementów sekwencji' basic_string' mogą zostać unieważnione przez następujące zastosowania tego obiektu 'basic_string': ... Wywołanie danych () 'i' c_str() 'funkcje składowe" (C++ 03 21.3/5). Uznalbym, że 'c_str()' zwraca wskaźnik do elementu w łańcuchu, tak że wskaźnik _ może być unieważniony przez inne wywołanie 'c_str()'. Mogę się mylić. –
Myślę, że istniał pomysł, że basic_string może zaimplementować c_str() przez dodanie '\ 0' do jego wewnętrznego bufora i zwrócenie wskaźnika do tego dołączonego bufora. Taka implementacja rzadko przechowuje '\ 0' i nigdy nie przechowuje dwóch kopii.Cytowany tekst pozwala na to - nie jest sprecyzowane, czy 'c_str' zwraca wskaźnik do elementów lub wskaźnik do kopii tych elementów. – MSalters