Не могу сделать следующее: Есть умный указатель, хочу забрать у него указатель и чтобы shared_ptr им больше не управлял. int* f(void) { boost::shared_ptr<int> sp(new int(9)); // Код int* p = sp.что_то(); return p; } // sp выходит из области видимости и НЕ удаляет указатель!!! Сразу оговариваю это схематичный пример - но он показывает что мне нужно.
systemio, всё, труба, ты можешь скопировать указатель, но не забрать. Т.е. destructor будет вызван - так проектировалось. Т.е. правь код вокруг - просто посылай "shared_ptr<Type> ptr" везде. P.S. если у тебя указатель на системный ресурс, то ты можешь зацепить free_this_thing() ф-цию.
Velheart auto_ptr то что надо но у меня нужно удалять не через delete - поэтому не подходит :-(. s0larian Видимо придется сделать свой auto_ptr с дополнительной функциональностью. Спасибо всем!
systemio Наследуйся от shared_ptr и прикрути эту "фичу" через custom deleter. Если без этой фичи никак, значит что-то не так у тебя з дизайном проекта.
Так я ж про это упоминал: boost::shared_ptr<X509_STORE> trusted_store((X509_STORE_new(), X509_STORE_free);
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.