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!