std::shared_ptr release (отобрать владение объектом)
От: Zenden Россия  
Дата: 26.03.15 14:38
Оценка:
Пытаюсь отобрать у шаред поинтера (std::tr1::shared_ptr) указатель, но он, упрямый, сопротивляется . Имеется вот такой класс — кастомный deleter (взято со stackoverflow):
// std::shared_ptr release() implementation
// thx to http://stackoverflow.com/questions/1833356/detach-a-pointer-from-a-shared-ptr/5995770#5995770
// 
template <typename T>
class release_deleter{
public:
    release_deleter() : released_(false){}
    void release() {released_ = true;}
    void reset_released() { released_ = false;}
    void operator()(T* ptr){
        LOG(INFO) << this;
        if(!released_) 
            delete ptr;
    }

private:
    bool released_;
};


Использую я его следующим образом:
release_deleter<Gdiplus::Bitmap> capturedBitmapDeleter_;
std_tr::shared_ptr<Gdiplus::Bitmap> capturedBitmap_;
...
LOG(INFO) << &capturedBitmapDeleter_;
capturedBitmap_.reset(capturedBitmap, capturedBitmapDeleter_);
// Хочу отобрать у него указатель
capturedBitmapDeleter_.release();
Gdiplus::Bitmap*  res =  m_capturedBitmap.get();
// И получаю в последствии access violation ;((((


Проблема в том, что LOG(INFO) выводят разные указатели! То есть объект capturedBitmapDeleter_ копируется.
Добавляю в класс
private:
DISALLOW_COPY_AND_ASSIGN(release_deleter<T>);

и получаю

error C2248: 'release_deleter<T>::release_deleter' : cannot access private member declared in class 'release_deleter<T>'



Как это исправить?
Компилятор VS 2008 SP1.
Отредактировано 26.03.2015 14:48 Zenden . Предыдущая версия . Еще …
Отредактировано 26.03.2015 14:42 Zenden . Предыдущая версия .
Отредактировано 26.03.2015 14:41 Zenden . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.