Когда деструктор временного объекта называется [дубликат] ⇐ C++
-
Гость
Когда деструктор временного объекта называется [дубликат]
В моей кодовой базе много таких операторов журналирования:
struct Foo { целое значение = 0; std::string toString() { return std::format("Foo({})", value); } }; Фу-фу; log("Мой журнал: %s", foo.toString().c_str()); Мне это кажется небезопасным, поскольку я ожидаю следующей последовательности операций:
[*]toString() возвращает std::string Вызывается [*]c_str(), возвращающий необработанный указатель char*. [*]Вызывается деструктор строки, освобождающий память, на которую указывает char*. [*]Функция журнала вызывается с использованием теперь недопустимого указателя char*.
...однако на практике я ни разу не видел ошибок с этим кодом, в том числе при включении TSAN/ASAN. Это говорит о том, что код безопасен и происходит правильное действие, поэтому нет необходимости менять код. Является ли поведение, которое я наблюдаю, действительно ожидаемым/требуемым поведением, указанным в стандарте C++?
В моей кодовой базе много таких операторов журналирования:
struct Foo { целое значение = 0; std::string toString() { return std::format("Foo({})", value); } }; Фу-фу; log("Мой журнал: %s", foo.toString().c_str()); Мне это кажется небезопасным, поскольку я ожидаю следующей последовательности операций:
[*]toString() возвращает std::string Вызывается [*]c_str(), возвращающий необработанный указатель char*. [*]Вызывается деструктор строки, освобождающий память, на которую указывает char*. [*]Функция журнала вызывается с использованием теперь недопустимого указателя char*.
...однако на практике я ни разу не видел ошибок с этим кодом, в том числе при включении TSAN/ASAN. Это говорит о том, что код безопасен и происходит правильное действие, поэтому нет необходимости менять код. Является ли поведение, которое я наблюдаю, действительно ожидаемым/требуемым поведением, указанным в стандарте C++?
Мобильная версия