Hi All,

 

I am using boost 1.41.0 on Windows with Visual Studio 2008 and am seeing what seems to be an issue with signals2 and shared_ptr.  The problem is that the shared_ptr does not decrement is reference count after I disconnect the signals2::connection. This is probably best illustrated with some code.

 

  ===== Test.h=====

#ifndef _CLASS1_H

#define _CLASS1_H

 

#include <boost/signals2/signal.hpp>

#include <boost/smart_ptr.hpp>

 

class Callee : public boost::enable_shared_from_this<Callee> {

public:

    Callee() :

      mInt(0)

    {};

    virtual ~Callee() {};

 

    void func1() { mInt++; };

 

private:

    int mInt;

};

 

 

class Caller {

public:

    typedef boost::signals2::signal<void (boost::shared_ptr<Callee>)> OnRun;

 

public:

    Caller() :

      mOnRun()

    {};

    ~Caller() {};

 

    void run(boost::shared_ptr<Callee> sp)

    {

      boost::signals2::connection conn = mOnRun.connect(boost::bind(&Callee::func1, sp));

      _sleep(1000);

      conn.disconnect();

    };

 

private:

    OnRun mOnRun;

};

#endif

===== End Test.h=====

 

======main.cpp======

 

int

main(int argc, char **argv)

{

                Caller caller;

                {

                                boost::shared_ptr<Callee> sp(new Callee);

                                caller.run(sp);

                }

}

======End main.cpp======

 

 

Running this in the debugger I would expect to hit a breakpoint in the Callee class before the Caller class, this is not the case I destruct Caller before Callee. Having dug in a bit I see the use_count of the shared pointer go to 2 while in the caller.run which I would expect. The strange thing is the use_count does not decrement after the disconnect or exiting the caller.run function.

 

Is there a way to force the connection/signal to release that shared_ptr?

 

Thanks

 

 Glenn