🍪 Зачем нужен std::out_ptr, если есть &ptr?

🍪 Зачем нужен std::out_ptr, если есть &ptr?

Многие С++ разработчики передают &smart_ptr в C API, думая, что это безопасно. Спойлер: это undefined behavior, который может молча сломать ваш код.

👁 Проблема на уровне памяти

std::unique_ptr<T> — это не просто T*. Внутри он хранит указатель + deleter. Когда вы пишете CreateObject(&my_ptr), C функция записывает адрес напрямую в память smart pointer, минуя деструктор старого объекта.

unique_ptr<Obj> ptr = make_unique<Obj>(); // ptr владеет объектом
CreateObject(&ptr); // UB! Старый объект утёк

🍿 Как работает out_ptr

std::out_ptr(ptr) создаёт временный proxy-объект. Он:

• Вызывает ptr.reset() при создании (освобождает старый ресурс)
• Предоставляет адрес внутреннего T** для C функции
• При уничтожении передаёт владение обратно в smart pointer

auto ptr = make_unique<Obj>();
CreateObject(std::out_ptr(ptr)); // Безопасно!

💡 Под капотом proxy хранит два указателя: временный T* для C API и ссылку на исходный smart pointer. Деструктор proxy вызывает ptr.reset(temp_ptr).

❗️Практика: всегда используйте out_ptr для output-параметров в C API.
Просмотры: 232
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти