boost::shared_ptr - detach() ?
От: nen777w  
Дата: 22.08.11 13:48
Оценка:
Вот никогда не думал что понадобиться отцепить память от умного указателя.
Но как оказалось такой возможности даже и нет.

это ведь можно было трактовать как освобождение умного указателя т.е. уменьшить счётчик и отдать указатель.
т.е. Я понимаю что shared_ptr потокобезопасный, и всё такое, но было бы удобно если б такая возможность всё же была, тем более программист делает это явно, занчит знает что стреляет в ногу.
Re: boost::shared_ptr - detach() ?
От: OdesitVadim Украина  
Дата: 22.08.11 14:33
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Вот никогда не думал что понадобиться отцепить память от умного указателя.

N>Но как оказалось такой возможности даже и нет.

N>это ведь можно было трактовать как освобождение умного указателя т.е. уменьшить счётчик и отдать указатель.

N>т.е. Я понимаю что shared_ptr потокобезопасный, и всё такое, но было бы удобно если б такая возможность всё же была, тем более программист делает это явно, занчит знает что стреляет в ногу.\
Возможность есть. Называется release. Но работает только, если use_count == 1. объяснения здесь http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm (если use_count > 1, то выстрел в ногу гарантирован. Зачем его тогда делать?)
Re[2]: boost::shared_ptr - detach() ?
От: nen777w  
Дата: 22.08.11 14:59
Оценка:
OV>Возможность есть. Называется release.

гм... может у нас с вами boost-ы разные? У меня 1.47

boost::shared_ptr<int> a;
a.release(); //error C2039: 'release' : is not a member of 'boost::shared_ptr<T>'

делать swap с shared_ptr у которого пустой deleter, блин ну тупо же как то...
Re[3]: boost::shared_ptr - detach() ?
От: wander  
Дата: 22.08.11 17:35
Оценка: 4 (1)
Здравствуйте, nen777w, Вы писали:

N>делать swap с shared_ptr у которого пустой deleter, блин ну тупо же как то...


здесь
Автор:
Дата: 02.10.09
.
Я там отвечал уже, было дело, только методы неудачно названы, но это дело поправимое.
Re: boost::shared_ptr - detach() ?
От: usc.urich Россия  
Дата: 23.08.11 10:55
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Вот никогда не думал что понадобиться отцепить память от умного указателя.

N>Но как оказалось такой возможности даже и нет.

Метод reset тебе поможет.
Если умеешь защищать программы, то умеешь их и ломать, но не наоборот.
Документация как секс — лучше любая, чем никакой.
Re[2]: boost::shared_ptr - detach() ?
От: nen777w  
Дата: 23.08.11 13:05
Оценка:
Здравствуйте, usc.urich, Вы писали:

UU>Здравствуйте, nen777w, Вы писали:


N>>Вот никогда не думал что понадобиться отцепить память от умного указателя.

N>>Но как оказалось такой возможности даже и нет.

UU>Метод reset тебе поможет.

Метод reset мне никак не поможет.
Re: boost::shared_ptr - detach() ?
От: 5er Россия  
Дата: 23.08.11 13:59
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Вот никогда не думал что понадобиться отцепить память от умного указателя.

N>Но как оказалось такой возможности даже и нет.

N>это ведь можно было трактовать как освобождение умного указателя т.е. уменьшить счётчик и отдать указатель.

N>т.е. Я понимаю что shared_ptr потокобезопасный, и всё такое, но было бы удобно если б такая возможность всё же была, тем более программист делает это явно, занчит знает что стреляет в ногу.

Возможность-то есть, нужно написать свой deleter.
Пример ниже:


template <typename T> 
class detach_deleter
{ 
    volatile bool m_bDetached;

public: 

    detach_deleter(): 
        m_bDetached( false )
    {
    } 
    void operator()(T* ptr)
    {
        if( !m_bDetached ) 
            delete ptr;
    } 
    void detach() 
    {
        m_bDetached = true;
    } 
};

class Foo
{
public:
    Foo() {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    boost::shared_ptr<Foo> spFoo( new Foo, detach_deleter<Foo>() ); 
    boost::get_deleter< detach_deleter<Foo> >( spFoo )->detach();
    delete spFoo.get();
    return 0;
}


Но мне, честно говоря, не хотелось бы видеть этот код у себя в репозитории.
Re[2]: boost::shared_ptr - detach() ?
От: nen777w  
Дата: 23.08.11 14:50
Оценка:
угум. про делетер Я уже успел догадаться ещё вчера.
но всёравно спасибо.

Честно говоря там функция переходник которая использует API которому нужен этот shared_ptr
Щас покажу схематически:


struct incomming_data
{
   unsigned char* data;
   unsigned int size;
};

struct internal_data
{
   boost::shared_ptr<unsigned char>  ptr_data;
   unsigned int size; 
};

void make_object_with_some_conversion( const internal_data* in, internal_data* out );

internal_data  make_internal_data__from_incomming_data( const incomming_data& data_in, internal_data& data_out )
{  
   internal_data object;
   internal_data tmp;
   tmp.ptr_data.reset( data_in.data );
   tmp.size = data_in.size;

   make_object_with_some_conversion( &tmp, &object );

   //обязательно
   tmp.ptr_data.detach();
  
   return object;
}


так что вот так бывает. без detach() никак.
Re[3]: boost::shared_ptr - detach() ?
От: MT-Wizard Украина  
Дата: 23.08.11 16:46
Оценка:
Здравствуйте, nen777w, Вы писали:

N>...

N>
N>   internal_data object;
N>   internal_data tmp;
N>   tmp.ptr_data.reset( data_in.data );
N>   tmp.size = data_in.size;
N>


tmp.ptr_data.reset( data_in.data, null_deleter() );

?
А ти, москалику, вже приїхав (с)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.