Сгенерированный указатель будет действителен до тех пор, пока временная переменная все еще существует, что обычно до конца выражения. Исключения составляют случаи, когда временный объект используется в инициализаторе (в этом случае он длится до завершения инициализации) или когда он связан со ссылкой. Временный в операторе return функции продолжается до выхода из функции (если он не связан со ссылкой). Как только временная жизнь заканчивается, временная уничтожается. В этом случае это означает, что строковый деструктор запускается, и поэтому память для символов освобождается. Другими словами, как только значение возвращается, оно гарантированно недействительно.
Вы можете передать саму строку обратно, возвращая ее как константную ссылку. Вы можете скопировать .c_str () во вновь выделенную память и передать ее обратно (как указатель или умный указатель). Любой из них будет работать.
Срок службы временных файлов описан в разделе 12.2 стандарта C ++. Согласно стандарту вы возвращаете указатель на освобожденную память.