Paul Davis wrote:
> below is a tiny program that demonstrates either an anti-pattern or a
> bug or both in the use/design of libsigc++. the program will generally
> run normally, but using valgrind reveals something deeply wrong, as
> noted in the annotations in the code.
>   
Paul,

Fixed:

#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <sigc++/sigc++.h>

class B;

class A : public sigc::trackable
{
    public:
        A () {}

        void signal_handler (boost::weak_ptr<B>) {};
};

class B : public sigc::trackable
{
    public:
        B () {}

        sigc::signal<void> MySignal;
};

int
main (int argc, char* argv[])
{
    {
        boost::shared_ptr<A> a (new A);

        {
            boost::shared_ptr<B> b (new B);
            boost::weak_ptr<B> c( b ) ;

            b->MySignal.connect (sigc::bind (sigc::mem_fun (*(a.get()), 
&A::signal_handler), c));

        }
    }

    return 0;
}

As b goes out of scope, new B gets deleted as normal.
Now, as the slot gets destroyed its just a weak_ptr, no double delete.

I'm not exactly sure how you managed to get the double delete with a 
shared_ptr. And I'm kind of wired and caught up in my own software stuff 
at the moment right now, but I once read about using weak_ptr's to 
remove cyclic dependencies.

I'm not sure where the problem is. If its sigc or boost.  I'm guessing 
its just a weird corner case between the usage.

Paul Davis
(no, I'm not answering my own question)
_______________________________________________
libsigc-list mailing list
libsigc-list@gnome.org
http://mail.gnome.org/mailman/listinfo/libsigc-list

Reply via email to