Hello,
These kind of bugs are well known, see for instance these two in Qt
applications (which Wt is heavily inspired on)
http://blogs.kde.org/2009/03/26/how-crash-almost-every-qtkde-application-and-how-fix-it-0
http://agateau.com/2010/09/29/fun-with-event-loops-and-qobjectdeletelater/
On Tue, Apr 16, 2013 at 12:30 PM, Dmitriy Igrishin <dmit...@gmail.com>wrote:
> Hey all,
>
> Recently I catched a bug (or misdesign) in WMenu and
> concluded for myself that slots should never perform
> deletion of the objects which methods emit the related
> signals. This may leads to undefined behavior.
>
> Consider:
>
> // WARNING: bad code!
> //
> // Gdb run command: run --docroot . --http-address 0.0.0.0 --http-port 8888
> #include <Wt/WApplication>
> #include <Wt/WMenu>
> #include <Wt/WPopupMenu>
> #include <Wt/WStackedWidget>
>
> namespace {
>
> class App : public Wt::WApplication {
> public:
> App(const Wt::WEnvironment& env);
> private:
> void del();
>
> Wt::WMenu* m_;
> };
>
> void App::del()
> {
> // This slot will be called from WMenu::select():
> // ...
> // item->triggered().emit(item);
> // itemSelected_.emit(item);
> // ...
> // and thus leads to undefined behaviour, since `this'
> // will point to the deleted WMenu after item->triggered().emit(item).
> delete m_;
> m_ = 0;
> }
>
> App::App(const Wt::WEnvironment& env)
> : WApplication(env)
> {
> using Wt::WText;
>
> Wt::WStackedWidget* const c = new Wt::WStackedWidget;
> root()->addWidget(c);
>
> // Menu
> m_ = new Wt::WMenu(c);
> root()->addWidget(m_);
>
> // Submenu
> Wt::WPopupMenu* const pm = new Wt::WPopupMenu(c);
> m_->addMenu("User Foo", pm);
> pm->addItem("Logout", this, &App::del);
> }
>
> Wt::WApplication* createApp(const Wt::WEnvironment& env)
> {
> return new App(env);
> }
>
> } // namespace
>
> int main(int argc, char* argv[])
> {
> return Wt::WRun(argc, argv, createApp);
> }
>
> While the example above demonstrates a bug (or invalid usage
> due to the lack of documentary cautions from such use) in WMenu,
> IMO it demonstrates unrecommened and dangerous pratice in general.
> Thus, I think that the rule: "slots should never perform deletion of the
> objects which methods emit the related signals" should be documented
> to prevent users from corresponding gotchas.
>
> Thoughts?
>
> --
> // Dmitriy.
>
>
>
> ------------------------------------------------------------------------------
> Precog is a next-generation analytics platform capable of advanced
> analytics on semi-structured data. The platform includes APIs for building
> apps and a phenomenal toolset for data science. Developers can use
> our toolset for easy data analysis & visualization. Get a free account!
> http://www2.precog.com/precogplatform/slashdotnewsletter
> _______________________________________________
> witty-interest mailing list
> witty-interest@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/witty-interest
>
>
--
Pau Garcia i Quiles
http://www.elpauer.org
(Due to my workload, I may need 10 days to answer)
------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
witty-interest mailing list
witty-interest@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/witty-interest