Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, _ds_, Вы писали:
__>>>Может вам подойдет boost::intrusive_ptr ?
__>>Тоже вариант.
__>>А насколько корректно использование здесь shared_count из boost/smart_ptr/detail/shared_count.hpp?
__>Все что есть в бусте можно использовать.
__>Классы которые лежат в директории details не дают гарантию интерфейса, т.е. могут измениться в следующей версии хоть полностью.
__>Почитайте туториалы и примеры boost smart ptr, может найдется то, что вам нужно.
__>В любом случае если вам он подходит и сокращает время, то надо юзать
Ясно, спасибо
Решил таки использовать intrusive_ptr. Для упрощения работы с ним написал такой вот класс:
// initialCounterValue equal to zero if we use intrusive_ptr<MyClass> p(new MyClass);
// initialCounterValue equal to one if we use intrusive_ptr<MyClass> p(new MyClass, false);
template<typename T, long initialCounterValue = 0>
class RefCountable {
friend void intrusive_ptr_add_ref(RefCountable<T> const* p) {
// increase reference count
::InterlockedIncrement(&p->m_refCount);
}
friend void intrusive_ptr_release(RefCountable<T> const* p) {
// decrease reference count and delete object if reference count became equal to zero
if (0 == ::InterlockedDecrement(&p->m_refCount)) {
delete p;
}
}
protected:
// constructor
RefCountable() : m_refCount(initialCounterValue) {}
// copy constructor
RefCountable(RefCountable const&) : m_refCount(initialCounterValue) {}
// assign operator
RefCountable& operator=(RefCountable const&) {
return *this;
}
// virtual destructor
virtual ~RefCountable() {}
private:
long mutable m_refCount;
};
Мне только не нравится, что наследование от него должно быть обязательно public.