Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Qt examples and the usage of pointers

Qt examples and the usage of pointers

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 3 Posters 4.5k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    Defohin
    wrote on last edited by
    #1

    I've been reading a few example Qt has and I noticed that they use a lot of pointers and don't delete them after, so I was wondering if it's a magic or it actually leaks, for instance:

    The example echoplugin, on the file echowindow.cpp at line 118 it takes the instance of a plugin and after that it's not deleted. The same happens with a lot of other things, like new QLineEdit.

    What is happening on the background here?

    1 Reply Last reply
    0
    • p3c0P Offline
      p3c0P Offline
      p3c0
      Moderators
      wrote on last edited by p3c0
      #2

      @Defohin
      Actually it is documented here.
      Quoting a statement from it:

      Once loaded, plugins remain in memory until all instances of QPluginLoader has been unloaded, or until the application terminates. You can attempt to unload a plugin using unload()...

      And then what unload says:

      This happens automatically on application termination, so you shouldn't normally need to call this function.
      Don't try to delete the root component. Instead rely on that unload() will automatically delete it when needed.

      So in the end all the instances will be deleted on program termination.

      157

      1 Reply Last reply
      1
      • D Offline
        D Offline
        Defohin
        wrote on last edited by
        #3

        What about the other things such as new QLineEdit is it going to be deleted automatically also? How do I know when a pointer is going to leak or not in Qt?

        p3c0P 1 Reply Last reply
        0
        • D Defohin

          What about the other things such as new QLineEdit is it going to be deleted automatically also? How do I know when a pointer is going to leak or not in Qt?

          p3c0P Offline
          p3c0P Offline
          p3c0
          Moderators
          wrote on last edited by p3c0
          #4

          @Defohin AFAIK they are reparented. You see these widgets are added into the gridlayout and is then set as the main layout for EchoWindow. So when EchoWindow is deleted it deletes the layout which eventually deletes these widgets.

          157

          D 1 Reply Last reply
          1
          • p3c0P p3c0

            @Defohin AFAIK they are reparented. You see these widgets are added into the gridlayout and is then set as the main layout for EchoWindow. So when EchoWindow is deleted it deletes the layout which eventually deletes these widgets.

            D Offline
            D Offline
            Defohin
            wrote on last edited by
            #5

            @p3c0 How do I know when a pointer is going to leak or not in Qt?

            mrjjM 1 Reply Last reply
            0
            • D Defohin

              @p3c0 How do I know when a pointer is going to leak or not in Qt?

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @Defohin said in Qt examples and the usage of pointers:

              @p3c0 How do I know when a pointer is going to leak or not in Qt?

              You cannot. Just like any other pointer.
              But you can Design your app so all Widgets
              have a Parent and all parents are owned by
              Main Window.
              So just normal care is needed.

              D 1 Reply Last reply
              0
              • mrjjM mrjj

                @Defohin said in Qt examples and the usage of pointers:

                @p3c0 How do I know when a pointer is going to leak or not in Qt?

                You cannot. Just like any other pointer.
                But you can Design your app so all Widgets
                have a Parent and all parents are owned by
                Main Window.
                So just normal care is needed.

                D Offline
                D Offline
                Defohin
                wrote on last edited by
                #7

                @mrjj That is kinda tricky, I tried to use a few softwares to detect leaking but they say that even if my pointer has a parent like new SomeClass(this) it's "leaking", it's probably false positive, but they say it's a leak, so I have no idea when it's an actual leak or not.

                1 Reply Last reply
                0
                • mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by mrjj
                  #8

                  Yes its tricky.
                  Tools like valgrind needs tweaking to reduce the noise.
                  If the tool is too simple , it dont understand the delete by parent and
                  when it see no delete for it, flag as leak.

                  On the bright side, its not that easy to make a leak as not assigning a parent will make it a
                  window and embedding a widget into something will (almost) surely own it. ( like layouts)

                  D 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    Yes its tricky.
                    Tools like valgrind needs tweaking to reduce the noise.
                    If the tool is too simple , it dont understand the delete by parent and
                    when it see no delete for it, flag as leak.

                    On the bright side, its not that easy to make a leak as not assigning a parent will make it a
                    window and embedding a widget into something will (almost) surely own it. ( like layouts)

                    D Offline
                    D Offline
                    Defohin
                    wrote on last edited by
                    #9

                    @mrjj said in Qt examples and the usage of pointers:

                    On the bright side, its not that easy to make a leak as not assigning a parent will make it a
                    window and embedding a widget into something will (almost) surely own it. ( like layouts)

                    What you mean with that? Sorry for my ignorance.

                    mrjjM 1 Reply Last reply
                    0
                    • D Defohin

                      @mrjj said in Qt examples and the usage of pointers:

                      On the bright side, its not that easy to make a leak as not assigning a parent will make it a
                      window and embedding a widget into something will (almost) surely own it. ( like layouts)

                      What you mean with that? Sorry for my ignorance.

                      mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      @Defohin
                      Hi
                      Well when I first started Qt I was also a bit sceptical about never
                      calling delete on my widgets. ( as in pure c++ its a leak)

                      However, if you try to design an application and forget to assign parent, you will find it as it becomes a window.

                      QLabel *mine= new QLabel();
                      mine->show()

                      Will popup as a window and its very clear something its up.

                      Also then you want to place it into some other widget, you
                      use layouts.
                      and as soon as you go
                      somewidget->layout()->addWidget(mine)
                      its owned by the layout.

                      So its actually a bit hard to create a widget you dont want as window and create leak
                      without assigning a parent as it will clearly show :)

                      That leaves mostly QDialogs and windows to leak but there you have
                      diag->setAttribute(Qt::WA_DeleteOnClose);
                      So if closed, they clean up.

                      D 1 Reply Last reply
                      0
                      • mrjjM mrjj

                        @Defohin
                        Hi
                        Well when I first started Qt I was also a bit sceptical about never
                        calling delete on my widgets. ( as in pure c++ its a leak)

                        However, if you try to design an application and forget to assign parent, you will find it as it becomes a window.

                        QLabel *mine= new QLabel();
                        mine->show()

                        Will popup as a window and its very clear something its up.

                        Also then you want to place it into some other widget, you
                        use layouts.
                        and as soon as you go
                        somewidget->layout()->addWidget(mine)
                        its owned by the layout.

                        So its actually a bit hard to create a widget you dont want as window and create leak
                        without assigning a parent as it will clearly show :)

                        That leaves mostly QDialogs and windows to leak but there you have
                        diag->setAttribute(Qt::WA_DeleteOnClose);
                        So if closed, they clean up.

                        D Offline
                        D Offline
                        Defohin
                        wrote on last edited by
                        #11

                        @mrjj The same happens with QObject? If I don't assign a parent to it?

                        mrjjM 1 Reply Last reply
                        0
                        • D Defohin

                          @mrjj The same happens with QObject? If I don't assign a parent to it?

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by mrjj
                          #12

                          Yes, its actually QObject that does this Parent->Child deleting and not Qwidgets :)

                          But QObject dont become window. Its a QWidgets thing.

                          Just so we are clear. All QWidgets are QObject :)

                          D 1 Reply Last reply
                          0
                          • mrjjM mrjj

                            Yes, its actually QObject that does this Parent->Child deleting and not Qwidgets :)

                            But QObject dont become window. Its a QWidgets thing.

                            Just so we are clear. All QWidgets are QObject :)

                            D Offline
                            D Offline
                            Defohin
                            wrote on last edited by
                            #13

                            @mrjj Meaning that if I don't delete QObject or assign a parent to it, it's going to leak, correct?

                            mrjjM 1 Reply Last reply
                            0
                            • D Defohin

                              @mrjj Meaning that if I don't delete QObject or assign a parent to it, it's going to leak, correct?

                              mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

                              @Defohin
                              Yes that could happen.
                              http://doc.qt.io/qt-5/objecttrees.html

                              D 1 Reply Last reply
                              1
                              • mrjjM mrjj

                                @Defohin
                                Yes that could happen.
                                http://doc.qt.io/qt-5/objecttrees.html

                                D Offline
                                D Offline
                                Defohin
                                wrote on last edited by
                                #15

                                @mrjj Thank you, it's really tricky, but I'll try to be careful with that.

                                mrjjM 1 Reply Last reply
                                0
                                • D Defohin

                                  @mrjj Thank you, it's really tricky, but I'll try to be careful with that.

                                  mrjjM Offline
                                  mrjjM Offline
                                  mrjj
                                  Lifetime Qt Champion
                                  wrote on last edited by mrjj
                                  #16

                                  @Defohin
                                  well, you should also look into using smart pointers.
                                  Thats how its managed in plain c++.
                                  http://stackoverflow.com/questions/31750689/how-to-use-smart-pointer-for-auto-clean-up
                                  https://en.wikipedia.org/wiki/Smart_pointer

                                  Small note. Do not put smart pointers on Widgets with parents as it get ugly :)

                                  Also Qt comes with Qt versions of those.

                                  D 1 Reply Last reply
                                  2
                                  • mrjjM mrjj

                                    @Defohin
                                    well, you should also look into using smart pointers.
                                    Thats how its managed in plain c++.
                                    http://stackoverflow.com/questions/31750689/how-to-use-smart-pointer-for-auto-clean-up
                                    https://en.wikipedia.org/wiki/Smart_pointer

                                    Small note. Do not put smart pointers on Widgets with parents as it get ugly :)

                                    Also Qt comes with Qt versions of those.

                                    D Offline
                                    D Offline
                                    Defohin
                                    wrote on last edited by
                                    #17

                                    @mrjj Thank you very much.

                                    1 Reply Last reply
                                    0

                                    • Login

                                    • Login or register to search.
                                    • First post
                                      Last post
                                    0
                                    • Categories
                                    • Recent
                                    • Tags
                                    • Popular
                                    • Users
                                    • Groups
                                    • Search
                                    • Get Qt Extensions
                                    • Unsolved