Date: Fri, 15 Apr 2016 14:15:43 +0200 From: Raphael Kubo da Costa <rakuco@FreeBSD.org> To: freebsd-ports@freebsd.org Subject: Re: Need some help with c++/qt5 code Message-ID: <86inzjdq4w.fsf@FreeBSD.org> References: <570F85E3.6060000@ShaneWare.Biz> <CC7B253B-DE3B-4049-96D8-A06DB52A0346@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Dimitry Andric <dim@FreeBSD.org> writes: > On 14 Apr 2016, at 13:58, Shane Ambler <FreeBSD@ShaneWare.Biz> wrote: >> >> Hi there, while I am comfortable with c and python, I only know a little >> c++ and could use some help. > ... >> class TPanelFactory >> { >> QString m_panelType; >> static QMap<QString, TPanelFactory *> m_table; >> >> public: >> TPanelFactory(QString panelType); >> ~TPanelFactory(); >> >> QString getPanelType() const { return m_panelType; } >> >> virtual void initialize(TPanel *panel) = 0; >> virtual TPanel *createPanel(QWidget *parent); >> static TPanel *createPanel(QWidget *parent, QString panelType); >> }; >> >> m_table is then in the source file as >> >> QMap<QString, TPanelFactory *> TPanelFactory::m_table; >> >> The segfault happens in the constructor - >> >> TPanelFactory::TPanelFactory(QString panelType) >> : m_panelType(panelType) >> { >> assert(m_table.count(panelType) == 0); >> m_table[m_panelType] = this; >> } >> >> the last line causes the segfault, if I comment it out then main() is >> entered, but I expect removing that line will bite back soon enough. >> >> How can I get this working? >> >> Why would this fail on FreeBSD but not OSX or windows? > > Most likely the program depends on the initialization order of global > constructors. This is bad practice, and should be avoided. I agree. Maybe using Q_GLOBAL_STATIC helps? - Remove m_table from TPanelFactory. - In pane.cpp, you do something like this: typedef QMap<QString, TPanelFactory *> PanelMapType; Q_GLOBAL_STATIC(PanelMapType, s_panelMap); you then need to replace uses of m_table with s_panelMap and use s_panelMap->operation() instead of m_table.operation().
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86inzjdq4w.fsf>