Копался в исходниках libcxx (реализация STL из LLVM) с целью понять как устроен basic_filebuf внутри, наткнулся на такой момент:
template <class _CharT, class _Traits>
basic_filebuf<_CharT, _Traits>*
basic_filebuf<_CharT, _Traits>::close()
{
basic_filebuf<_CharT, _Traits>* __rt = nullptr;
if (__file_)
{
__rt = this;
unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
if (sync())
__rt = nullptr;
if (fclose(__h.release()))
__rt = nullptr;
__file_ = nullptr;
setbuf(0, 0);
}
return __rt;
}
В данном случае __file__ это указатель на сишную структуру FILE, вот здесь он заворачивается в unique_ptr,
unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose);
а вот здесь возвращают владение чтобы закрыть файл вручную и проверить что возвращает fclose:
if (fclose(__h.release()))
Правильно ли я понимаю, что это нужно лишь для того чтобы не получить висячий указатель если в sync() будет брошено исключение?