How can i hold reference in boost::shared_ptr using boost::bind without definition of explicit function?

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

  •  20-09-2019
  •  | 
  •  

Question

I want to hold reference to object so it doesn't get deleted in bind function, but without using helper function.

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) );

}

Is there a way to declare holdReference function in place? Like with lambda expressions or sth? (without using this nasty holdReference function, that have to be declared outside the scope of fun function) I had few tries but non of them compiled :)

Ok, here is more detailed example:

#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
Was it helpful?

Solution

You may be looking for the "shared ownership" constructor, this allows ref counting an interior pointer.

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);
}

OTHER TIPS

I am a bit confused by what you are trying to do here.

Is fun() supposed to return boost::shared_ptr<int> or boost::shared_ptr<Int>???

I don't think that you want to create a shared_ptr<int> that is a shared pointer around a raw pointer that is directly owned by the Int object, as the Int object will delete the _int whenever it goes out of scope (even though in the example it did not 'new' it!).

You need to come up with a clear ownership/responsibility model.

Perhaps you can provide a different, more realistic, example of what you are trying to achieve?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top