У меня есть вопрос, похожий на Как управлять временем жизни объекта с помощью интеллектуальных указателей библиотеки Boost? , но, в моем случае, «объект» вообще не объект C ++, а непрозрачный тип вернулся / потерял сознание от C API. Тип не имеет семантики указателей, т.е. нет разыменования; однако он передается в качестве аргумента другим функциям в C API. Тип также имеет определенный close
API, который должен вызываться для очистки внутренних ресурсов.
Итак, у меня есть C API, что-то вроде
opaque_legacy_type_t x;
XXopen(..., &x); // allocates/opens resource and fills out 'x' to be used later
XXdoSomethingWithResource(x, ...); // do something with resources related to 'x'
...more actions...
XXclose(x); // closes and cleans up resources related to 'x'
По разным причинам в моем коде на C ++ я хотел бы управлять «экземплярами» opaque_legacy_type_t так же, как я управлял бы экземплярами объекта, выделенными в куче, т.е. Кажется, что shared_ptr
предлагает достаточно, чтобы я мог управлять вызовом XXclose
, выполнив это:
opaque_legacy_type_t x;
XXopen(..., &x);
boost::shared_ptr<opaque_legacy_type_t> managed(x, XXclose);
Но, поскольку opaque_legacy_type_t
не имеет семантики указателей, использование managed
немного неуклюже.
Я хотел бы сделать что-то вроде managed_type
, похожее на shared_ptr
, и ищу идеи, которые не требуют, чтобы я все это написал.
РЕДАКТИРОВАТЬ: Я исправил мой первоначальный провал в примере. Устаревший API принимает непрозрачный тип по значению, а не по указателю.