Когда деструктор временного объекта называется [дубликат] ⇐ 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++?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему деструктор глобального объекта вызывается дважды после инициализации ссылки на него?
Anonymous » » в форуме C++ - 0 Ответы
- 25 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему деструктор глобального объекта вызывается дважды после инициализации ссылки на него?
Anonymous » » в форуме C++ - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-