boost::shared_ptr<>

Тема в разделе "LANGS.C", создана пользователем systemio, 24 апр 2009.

  1. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Не могу сделать следующее: Есть умный указатель, хочу забрать у него указатель и чтобы shared_ptr им больше не управлял.

    int* f(void)
    {
    boost::shared_ptr<int> sp(new int(9));

    // Код

    int* p = sp.что_то();

    return p;
    } // sp выходит из области видимости и НЕ удаляет указатель!!!

    Сразу оговариваю это схематичный пример - но он показывает что мне нужно.
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    http://www.boost.org/doc/libs/1_38_0/libs/smart_ptr/shared_ptr.htm#get ?
     
  3. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    неа. он просто дает указатель но не освобождает его.
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    а чем не устраивает auto_ptr ?
     
  5. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    systemio, всё, труба, ты можешь скопировать указатель, но не забрать. Т.е. destructor будет вызван - так проектировалось.

    Т.е. правь код вокруг - просто посылай "shared_ptr<Type> ptr" везде.

    P.S. если у тебя указатель на системный ресурс, то ты можешь зацепить free_this_thing() ф-цию.
     
  6. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Velheart
    auto_ptr то что надо но у меня нужно удалять не через delete - поэтому не подходит :-(.

    s0larian
    Видимо придется сделать свой auto_ptr с дополнительной функциональностью.

    Спасибо всем!
     
  7. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    systemio
    Наследуйся от shared_ptr и прикрути эту "фичу" через custom deleter.

    Если без этой фичи никак, значит что-то не так у тебя з дизайном проекта.
     
  8. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Так я ж про это упоминал:

    boost::shared_ptr<X509_STORE> trusted_store((X509_STORE_new(), X509_STORE_free);
     
  9. agrischuk

    agrischuk New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2009
    Сообщения:
    47
    Q. Why doesn't shared_ptr provide a release() function?

    A. shared_ptr cannot give away ownership unless it's unique() because the other copy will still destroy the object.

    Consider:

    shared_ptr<int> a(new int);
    shared_ptr<int> b(a); // a.use_count() == b.use_count() == 2

    int * p = a.release();

    // Who owns p now? b will still call delete on it in its destructor.

    Furthermore, the pointer returned by release() would be difficult to deallocate reliably, as the source shared_ptr could have been created with a custom deleter.
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    unique_ptr возьми