повышение :: shared_ ?? для не указательных ресурсов - PullRequest
2 голосов
/ 20 февраля 2011

По сути, мне нужно сделать подсчет ссылок на определенные ресурсы (например, на целочисленный индекс), которые не являются эквивалентами семантики указатель / адрес;в основном мне нужно обойти ресурс и вызвать определенную пользовательскую функцию, когда счетчик достигает нуля.Также доступ к ресурсу для чтения / записи - это не простая операция разыменования указателя, а нечто более сложное.Я не думаю, что boost :: shared_ptr будет соответствовать всем требованиям, но, может быть, я упускаю какой-то другой эквивалентный классу Boost, который я мог бы использовать?

пример того, что мне нужно сделать:

struct NonPointerResource
{
   NonPointerResource(int a) : rec(a) {} 

   int rec;
}

int createResource ()
{
   data BasicResource("get/resource");
   boost::shared_resource< MonPointerResource > r( BasicResource.getId() , 
    boost::function< BasicResource::RemoveId >() );
   TypicalUsage( r );
}  
//when r goes out of scope, it will call BasicResource::RemoveId( NonPointerResource& ) or something similar


int TypicalUsage( boost::shared_resource< NonPointerResource > r )
{
   data* d = access_object( r );
   // do something with d
}

Ответы [ 3 ]

5 голосов
/ 20 февраля 2011

Выделите NonPointerResource в куче и просто дайте ему деструктор как обычно.

4 голосов
/ 20 февраля 2011

Может быть, boost :: intrusive_ptr мог бы соответствовать всем требованиям. Вот базовый класс RefCounted и вспомогательные функции, которые я использую в некоторых моих кодах. Вместо delete ptr вы можете указать любую нужную вам операцию.

struct RefCounted {
    int refCount;

    RefCounted() : refCount(0) {}
    virtual ~RefCounted() { assert(refCount==0); }
};

// boost::intrusive_ptr expects the following functions to be defined:
inline
void intrusive_ptr_add_ref(RefCounted* ptr) { ++ptr->refCount; }

inline
void intrusive_ptr_release(RefCounted* ptr) { if (!--ptr->refCount) delete ptr; }

С этим на месте вы можете иметь

boost::intrusive_ptr<DerivedFromRefCounted> myResource = ...
1 голос
/ 21 февраля 2011

Здесь небольшой пример использования shared_ptr<void> в качестве счетного дескриптора.
Подготовка правильных функций создания / удаления позволяет нам использовать shared_ptr<void> как любой дескриптор ресурса в некотором смысле.
Тем не менее, как вы можете видеть, так как это слабо типизировано, использование его заставляет нас неудобства в некоторой степени ...

...