Heim >Backend-Entwicklung >C++ >Ist es sicher, auf „c_str()' eines temporären „std::string'-Objekts zuzugreifen?

Ist es sicher, auf „c_str()' eines temporären „std::string'-Objekts zuzugreifen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-06 19:10:03279Durchsuche

Is It Safe to Access the `c_str()` of a Temporary `std::string` Object?

Ist es sicher, auf c_str() einer temporären Zeichenfolge zuzugreifen?

In einem C-Programm gibt der folgende Code Anlass zur Sorge:

void consumer(char const* p) { std::printf("%s", p); }

std::string random_string_generator();

consumer(random_string_generator().c_str());

Es wird behauptet, dass das von random_string_generator generierte temporäre std::string-Objekt vor dem Aufruf an den Verbraucher zerstört werden könnte, wodurch der c_str()-Zeiger möglicherweise ungültig wird. Es ist jedoch von entscheidender Bedeutung, die Definition der Standardlebensdauer zu verstehen.

Gemäß dem C-Standard bleibt der von std::string::c_str() zurückgegebene Zeiger gültig, bis eine nicht konstante Funktion aufgerufen wird auf dem std::string-Objekt oder es wird zerstört. Im angegebenen Code wird das temporäre std::string-Objekt am Ende des vollständigen Ausdrucks, einschließlich des Aufrufs an den Verbraucher, zerstört. Dies bestätigt, dass der Code wohlgeformt ist.

Solange der Verbraucher nicht versucht, den c_str()-Zeiger für die spätere Verwendung aufzubewahren, kann man mit Sicherheit davon ausgehen, dass das temporäre std::string-Objekt dies nicht tun wird vorzeitig zerstört. Die Lebensdauer von Provisorien ist seit C 98 genau definiert, um sicherzustellen, dass Code wie der vorgestellte sicher auf verschiedenen Compilern ausgeführt wird.

Das obige ist der detaillierte Inhalt vonIst es sicher, auf „c_str()' eines temporären „std::string'-Objekts zuzugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn