Fix will be in public git soon.
Wim.
2013/4/16 Koen Deforche <[email protected]>
> Hey Pau, Dmitriy,
>
> Wt's signals are resilient to this (i.e. the signal can be deleted from a
> slot connected to it), and so should Wt widgets be designed (they should
> only emit a slot at the very end and be cautious that 'this' may be no
> longer valid after doing that).
>
> So it is a bug in Wt (WMenu/WMenuItem).
>
> Regards,
> koen
>
>
> 2013/4/16 Pau Garcia i Quiles <[email protected]>
>
>> 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 <[email protected]>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
>>> [email protected]
>>> 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
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/witty-interest
>>
>>
>
>
> ------------------------------------------------------------------------------
> 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/witty-interest
>
>
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/witty-interest