On Mon, 2016-02-08 at 10:18 +1300, Ian Martin wrote:
> Correct me if I'm wrong, but doesn't Gtk::manage work more like a
> shared 
> pointer? i.e. maintain a count of the references to the object,
> deleting 
> the object pointed to when the ref count goes to zero.

Not quite. GObject has simple reference-counting. But widgets have
actual ownership by container widgets, with some reference-counting
thrown in to confuse things. But in the end, containers can choose when
to destroy their child widgets.

Calling Gtk::manage() means "let the container destroy this", or more
fundamentally, it means "I am giving away the ownership".

> As you've said, using unique_pointer mandates a design with only one 
> access point to the controlled object,

I don't think that's quite true. You can get (a pointer to) the widget
back from its container widget.

>  and there's plenty of interesting 
> things you may want to do to widgets after construction.

You'd call std::move() when giving the ownership to the container
widget, not right after construction.

I like the explicit handing over of ownership of std::move()ing a
std::unique_ptr<> and I like that I'm encouraged to do that when I've
finished with the setup of the object.

>   We use 
> Gtk::manage() freely because it keeps track of widget memory use for
> us, 
> but doesn't control access to it within the code.

The intent is similar with std::unique_ptr<> and std::move(), but it's
a general and standardized technique.

> One option might be to provide 2 variants for Gtk::manage(); one
> using 
> shared_pointer semantics and one using unique_pointer, with a default
> to 
> shared (because it'd be backwards compatible).
> > It's also considered wise to receive a std::unique_ptr as a
> > parameter
> > if the method really plans to take ownership. For instance:
> >    void Foo::take_thing(std::shared_ptr<Thing> thing);
> I think you've typed std::shared_ptr<Thing> when you meant 
> std::unique_ptr<Thing> ?

Yes, sorry.

-- 
Murray Cumming
murr...@murrayc.com
www.murrayc.com



_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to