Этот код компилируется и выполняется. Я знаю, что у нас есть неопределенное поведение в первом случае. Но что происходит во втором случае?Когда именно происходит разрушение временного объекта во время вызова функции?
#include <string>
#include <iostream>
#include <cstdio>
std::string foo() {
return "HELLO";
}
void bar(const char *p) {
std::printf("%s\n", p);
}
int main() {
// FIRST CASE:
// I know this is bad, because after the assignment
// the variable returned by foo() is destroyed and we
// have a bad reference.
const std::string &s = foo();
bar(s.c_str());
// SECOND CASE:
// But what about that ? I don't know exactly if the
// object is alive after the call to c_str()
bar(foo().c_str());
return 0;
}
выход GCC в обоих случаях «HELLO», но я думаю, что это потому, что это не очистка сырой памяти.
Во втором случае, когда именно временный объект уничтожен?
Небольшая заметка для будущего интереса - Valgrind - это правильный инструмент для демонстрации ошибок после использования (и многих других). Как вы подозреваете, просто запуск кода, чтобы увидеть, если он работает, не обязательно расскажет вам об ошибках! –