[Interest] C'tor member initialisation with 'this'

Frank Hemer frank at hemer.org
Fri Jan 10 19:09:28 CET 2014


On Friday 10 January 2014 21:58:13 Constantin Makshin wrote:
> No, it won't. 'this' is just a pointer and copying it anywhere (except a
> free-memory-in-destructor kind of smartpointer, of course, but using these
> to store a pointer to the parent object is a weird idea anyway) doesn't
> affect the object's lifetime in any way; neither does the object's
> destructor gets called when a pointer to it is destroyed by going out of
> scope or any other means.

Well, I was confused by the QObject d'tor doc stating:

Warning: All child objects are deleted. If any of these objects are on the 
stack or global, sooner or later your program will crash. We do not recommend 
holding pointers to child objects from outside the parent. If you still do, 
the destroyed() signal gives you an opportunity to detect when an object is 
destroyed.

And the networkMgr is on the stack.

Frank


> On Jan 10, 2014 9:42 PM, "Frank Hemer" <frank at hemer.org> wrote:
> > On Friday 10 January 2014 20:51:35 Constantin Makshin wrote:
> > > Everything is OK unless QNetworkAccessManager's constructor (or anything
> > > further in the call chain) tries to use that pointer for anything beyond
> > > copying it somewhere else. What exactly is looking suspicious to you?
> > 
> > When the transports parent object gets deleted, it will delete the
> > transport.
> > Thus I wonder whether it could cause a duplicate delete ('this' gets
> > deleted
> > and will subsequently delete the networkMgr but it is a member var and
> > thus
> > will be deleted twice?
> > 
> > Frank
> > 
> > > On Jan 10, 2014 5:32 PM, "Frank Hemer" <frank at hemer.org> wrote:
> > > > Hi,
> > > > 
> > > > when looking at the code of the qt solutions (from git), I realized
> > > > following
> > > > snippet:
> > > > 
> > > > class QT_QTSOAP_EXPORT QtSoapHttpTransport : public QObject
> > > > {
> > > > 
> > > >    ...
> > > > 
> > > > private:
> > > >     QNetworkAccessManager networkMgr;
> > > >    
> > > >    ...
> > > > 
> > > > };
> > > > 
> > > > QtSoapHttpTransport::QtSoapHttpTransport(QObject *parent)
> > > > 
> > > >     : QObject(parent), networkMgr(this)
> > > > 
> > > > {
> > > > 
> > > >    ...
> > > > 
> > > > }
> > > > 
> > > > Is there any reason why the QNetworkAccessManager needs to be
> > 
> > initialized
> > 
> > > > with
> > > > the 'this' reference?
> > > > Seems like a wrong approach to me - maybe because it used to be a
> > 
> > pointer
> > 
> > > > at
> > > > some point in time?
> > > > 
> > > > I found this when analyzing some weird and not really reproducible
> > 
> > stack
> > 
> > > > traces ...
> > > > 
> > > > Frank
> > > > _______________________________________________
> > > > Interest mailing list
> > > > Interest at qt-project.org
> > > > http://lists.qt-project.org/mailman/listinfo/interest
> > 
> > _______________________________________________
> > Interest mailing list
> > Interest at qt-project.org
> > http://lists.qt-project.org/mailman/listinfo/interest



More information about the Interest mailing list