заставьте shared_ptr не использовать, удаляют

Вы можете попробовать это расширение

    public static bool IsSubClassOfGenericClass(this Type type, Type genericClass,Type t)
    {
        return type.IsSubclassOf(genericClass.MakeGenericType(new[] { t }));
    }
41
задан 14 January 2009 в 09:26
поделиться

4 ответа

Или как насчет того, чтобы использовать stl для обеспечения функтора обертки - описание Doug T., но без пользовательской вызывающей стороны.

boost::shared_ptr<T> ptr( new T, std::mem_fun_ref(&T::deleteMe) );
boost::shared_ptr<S> ptr( new S, std::ptr_fun(lib_freeXYZ) );
56
ответ дан Greg Domjan 23 September 2019 в 15:04
поделиться

Можно дать шаблону shared_ptr пользовательскую функцию средства удаления, которая имеет подпись

  void Deleter( T* ptr);

для повышения:: shared_ptr

Так для Средства удаления Вы сделали бы

  boost::shared_ptr<T> ptrToT( new T, Deleter );

тогда в теле Средства удаления:

   void Deleter( T* ptr);
   {
        ptr->deleteMe();
        // And make sure YOU ACTUALLY DELETE (or do whatever else you need to
        // do to release the resource)
        delete ptr;
   }

Для Вашего конкретного случая при необходимости в чем-то простом (как ptr-> deleteMe) посмотрите решение Greg, его очень хорошее.

37
ответ дан Doug T. 23 September 2019 в 15:04
поделиться

Для данных C-стиля сделайте как @Doug. T предложенный.

Для Вашего класса, почему бы не очистка в деструкторе? Даже если это включает deleteMe () в деструкторе.

1
ответ дан Kris Kumler 23 September 2019 в 15:04
поделиться

Doug T. ответил на Ваш вопрос приятно. Я скажу Вам о intrusive_ptr. Возможно, можно использовать его в проекте также.

, Если у Вас есть некоторая библиотека C, которая уже имеет подсчет ссылок, но необходимо вручную вызвать те функции, можно использовать boost::intrusive_ptr также, и предоставить надлежащие определения для его add_ref и выпустить функции. intrusive_ptr найдет и назовет их. Они ответственны, чтобы увеличить подсчет ссылок и постепенно уменьшить его, освобождая ресурс когда необходимый:

void intrusive_ptr_add_ref(foo *f) {
    lib_add_ref(f);
}

void intrusive_ptr_release(foo *f) {
    if(lib_dec_ref(f) == 0) 
        lib_free(f);
}

Тогда можно просто создать объекты из необработанных указателей типа foo*. intrusive_ptr , вызовет функции, когда копировал/разрушал:

intrusive_ptr<foo> f(lib_alloc());

// can wrap raw pointers too, which already may be referenced somewhere else
foo *p = get_foo_from_somewhere();
function_taking_intrusive_ptr(p);
10
ответ дан Johannes Schaub - litb 23 September 2019 в 15:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: