Библиотека C/C++ разработчика | cpp, boost, qt

@cppproglib
🍪 Зачем нужен 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.
Если у вас установлено приложение,
вы можете сразу перейти в канал