Как я могу сохранить ссылку в boost::shared_ptr, используя boost::bind без определения явной функции?

StackOverflow https://stackoverflow.com/questions/2453048

  •  20-09-2019
  •  | 
  •  

Вопрос

Я хочу сохранить ссылку на объект, чтобы он не удалялся в функции привязки, но без использования вспомогательной функции.

struct Int
{
   int *_int;
   ~Int(){ delete _int; }
};

void holdReference(boost::shared_ptr<Int>, int*) {} // helper

boost::shared_ptr<int> fun()
{
   boost::shared_ptr<Int> a ( new Int ); 
   // I get 'a' from some please else, and want to convert it
   a->_int = new int;

   return boost::shared<int>( a->_int, boost::bind(&holdReference, a, _1) );

}

Есть ли способ объявить функцию HoldReference?Например, с лямбда-выражениями или чем-то еще?(Без использования этой неприятной функции HoldReference, которые должны быть объявлены вне сферы веселой функции) У меня было мало попыток, но они не скомпилированы :)

Хорошо, вот более подробный пример:

#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>

// the case looks more or less like this
// this class is in some dll an I don't want to use this class all over my project
// and also avoid coppying the buffer
class String_that_I_dont_have 
{
    char * _data; // this is initialized in 3rd party, and released by their shared pointer

public:
    char * data() { return _data; }
};


// this function I created just to hold reference to String_that_I_dont_have class 
// so it doesn't get deleted, I want to get rid of this
void holdReferenceTo3rdPartyStringSharedPtr( boost::shared_ptr<String_that_I_dont_have>, char *) {}


// so I want to use shared pointer to char which I use quite often 
boost::shared_ptr<char> convert_function( boost::shared_ptr<String_that_I_dont_have> other) 
// 3rd party is using their own shared pointers, 
// not the boost's ones, but for the sake of the example ...
{
    return boost::shared_ptr<char>( 
        other->data(), 
        boost::bind(
            /* some in place here instead of holdReference... */
            &holdReferenceTo3rdPartyStringSharedPtr   , 
            other, 
            _1
        )
    );
}

int main(int, char*[]) { /* it compiles now */ }

// I'm just looking for more elegant solution, for declaring the function in place
Это было полезно?

Решение

Возможно, вы ищете конструктор «совместной собственности», который позволяет подсчитывать ссылки на внутренний указатель.

struct Int
{
   int *_int;
   ~Int(){ delete _int; }
};

boost::shared_ptr<int> fun()
{
   boost::shared_ptr<Int> a (new Int);
   a->_int = new int;

   // refcount on the 'a' instance but expose the interior _int pointer
   return boost::shared_ptr<int>(a, a->_int);
}

Другие советы

Меня немного смущает то, что вы пытаетесь здесь сделать.

Должно ли fun() вернуться? boost::shared_ptr<int> или boost::shared_ptr<Int>???

Я не думаю, что вы хотите создать shared_ptr<int> это общий указатель вокруг необработанного указателя, который напрямую принадлежит объекту Int, поскольку объект Int удалит _int всякий раз, когда он выйдет за пределы области видимости (хотя в примере он не «обновил» его!).

Вам необходимо разработать четкую модель владения/ответственности.

Возможно, вы можете привести другой, более реалистичный пример того, чего вы пытаетесь достичь?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top