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. double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set
Forum Updated to NodeBB v4.3 + New Features

double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set

Scheduled Pinned Locked Moved Solved General and Desktop
qdialogdeletelater
21 Posts 7 Posters 4.9k Views 2 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.
  • K kshegunov
    8 Nov 2021, 12:47

    @J-Hilk said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

    it's more sinister.

    There's nothing sinister, the OP already provided the answer.

    @LRDPRDX said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

    I suspect that the deleteLater() function is not allowed to be called on a stack variable but to confirm I (probably) need to go through the QCoreApplication::postEvent() function which is too complicated to me as a user and not a Qt-developer.

    No, delete is not allowed on a stack variable. You don't need to be a Qt developer to know this, and it has nothing to do with how you call the delete -- from the outside, from the inside (i.e. deleting this), through a custom event or without.

    J Offline
    J Offline
    JonB
    wrote on 8 Nov 2021, 12:48 last edited by JonB 11 Aug 2021, 12:49
    #8

    @kshegunov said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

    No, delete is allowed on a stack variable

    Do you perchance mean delete is not allowed on a stack variable?

    Oh, you updated your post after I posted this :)

    K 1 Reply Last reply 8 Nov 2021, 12:48
    0
    • J JonB
      8 Nov 2021, 12:48

      @kshegunov said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

      No, delete is allowed on a stack variable

      Do you perchance mean delete is not allowed on a stack variable?

      Oh, you updated your post after I posted this :)

      K Offline
      K Offline
      kshegunov
      Moderators
      wrote on 8 Nov 2021, 12:48 last edited by
      #9

      @JonB said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

      Do you perchance mean delete is not allowed on a stack variable?

      Indeed, it was a typo.

      Read and abide by the Qt Code of Conduct

      J 1 Reply Last reply 8 Nov 2021, 12:49
      0
      • K kshegunov
        8 Nov 2021, 12:48

        @JonB said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

        Do you perchance mean delete is not allowed on a stack variable?

        Indeed, it was a typo.

        J Offline
        J Offline
        JonB
        wrote on 8 Nov 2021, 12:49 last edited by JonB 11 Aug 2021, 12:52
        #10

        @kshegunov
        A "typo" is a misspelling, not a complete reversal of a comment's intention! :D

        And I agree it's about time somebody said you just must not delete a stack variable, period. [Whether WA_DeleteOnClose docs might mention that is what this does, and so should only be used on heap instances, is another matter. I was never clear just what exactly WA_DeleteOnClose did, though I used it.

        K 1 Reply Last reply 8 Nov 2021, 12:52
        0
        • K kshegunov
          8 Nov 2021, 12:47

          @J-Hilk said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

          it's more sinister.

          There's nothing sinister, the OP already provided the answer.

          @LRDPRDX said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

          I suspect that the deleteLater() function is not allowed to be called on a stack variable but to confirm I (probably) need to go through the QCoreApplication::postEvent() function which is too complicated to me as a user and not a Qt-developer.

          No, delete is not allowed on a stack variable. You don't need to be a Qt developer to know this, and it has nothing to do with how you call the delete -- from the outside, from the inside (i.e. deleting this), through a custom event or without.

          J Online
          J Online
          J.Hilk
          Moderators
          wrote on 8 Nov 2021, 12:51 last edited by
          #11

          @kshegunov said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

          There's nothing sinister, the OP already provided the answer.

          no matter what, telling a class to commit suicide is sinister in my books :P


          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


          Q: What's that?
          A: It's blue light.
          Q: What does it do?
          A: It turns blue.

          1 Reply Last reply
          0
          • J J.Hilk
            8 Nov 2021, 12:29

            @LRDPRDX you're right.

            it's more sinister.

            the QDialog implementation of delete on close is a delete this call. 😱 very naughty, even if allocated on the heap.

            so its not double free call, it's corruption.

            class MyPDialog : public QDialog
            {
            public:
                MyPDialog(QWidget *parent = nullptr) : QDialog(parent) {}
            
                void deleteOnClose() {delete this;}
            
                ~MyPDialog()
                {
                    qInfo() << "~MyPDialog()";
                }
            };
            
            
            int main(int argc, char *argv[])
            {
                QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
                QApplication app(argc, argv);
            
                MyPDialog d;
                d.deleteOnClose();
            //    d.setAttribute( Qt::WA_DeleteOnClose, true );
            //    int result = d.exec();
                qInfo() << "After exec" /*<< result*/;
            
                return app.exec();
            }
            
            L Offline
            L Offline
            LRDPRDX
            wrote on 8 Nov 2021, 12:51 last edited by
            #12

            @J-Hilk Cool -_-

            the QDialog implementation of delete on close is a delete this call

            Just to ensure : do you know this from this (line 613) ?

            J 1 Reply Last reply 8 Nov 2021, 12:52
            0
            • L LRDPRDX
              8 Nov 2021, 12:51

              @J-Hilk Cool -_-

              the QDialog implementation of delete on close is a delete this call

              Just to ensure : do you know this from this (line 613) ?

              J Online
              J Online
              J.Hilk
              Moderators
              wrote on 8 Nov 2021, 12:52 last edited by
              #13

              @LRDPRDX yes, its exactly where my debugger stopped.


              Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


              Q: What's that?
              A: It's blue light.
              Q: What does it do?
              A: It turns blue.

              1 Reply Last reply
              0
              • J JonB
                8 Nov 2021, 12:49

                @kshegunov
                A "typo" is a misspelling, not a complete reversal of a comment's intention! :D

                And I agree it's about time somebody said you just must not delete a stack variable, period. [Whether WA_DeleteOnClose docs might mention that is what this does, and so should only be used on heap instances, is another matter. I was never clear just what exactly WA_DeleteOnClose did, though I used it.

                K Offline
                K Offline
                kshegunov
                Moderators
                wrote on 8 Nov 2021, 12:52 last edited by
                #14

                @JonB said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                A "typo" is a misspelling, not a complete reversal of a comment's intention! :D

                I added the comma after the fact, which introduced the missing negation, so *shrug* happens.

                @J-Hilk said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                no matter what, telling a class to commit suicide is sinister in my books :P

                Your books are wrong. We are a free-haven! ;)

                Read and abide by the Qt Code of Conduct

                J 1 Reply Last reply 8 Nov 2021, 12:54
                3
                • K kshegunov
                  8 Nov 2021, 12:52

                  @JonB said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                  A "typo" is a misspelling, not a complete reversal of a comment's intention! :D

                  I added the comma after the fact, which introduced the missing negation, so *shrug* happens.

                  @J-Hilk said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                  no matter what, telling a class to commit suicide is sinister in my books :P

                  Your books are wrong. We are a free-haven! ;)

                  J Offline
                  J Offline
                  JonB
                  wrote on 8 Nov 2021, 12:54 last edited by
                  #15

                  @kshegunov said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                  I added the comma

                  Eats, Shoots & Leaves ;-)

                  1 Reply Last reply
                  2
                  • M Offline
                    M Offline
                    mpergand
                    wrote on 8 Nov 2021, 12:56 last edited by mpergand 11 Aug 2021, 13:04
                    #16

                    At the end of the QDialog:exec there are:

                    if (deleteOnClose)
                            delete this;
                    return res;
                    

                    On Mac i got:
                    malloc: *** error for object 0x7ffeefbffa60: pointer being freed was not allocated
                    so it crashes at the delete instruction and never returns.

                    1 Reply Last reply
                    2
                    • J Offline
                      J Offline
                      JonB
                      wrote on 8 Nov 2021, 12:58 last edited by
                      #17

                      @LRDPRDX OOI, which compiler, compiler options (debug/release) & platform are you on for your error message?

                      1 Reply Last reply
                      0
                      • K kshegunov
                        8 Nov 2021, 12:47

                        @J-Hilk said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                        it's more sinister.

                        There's nothing sinister, the OP already provided the answer.

                        @LRDPRDX said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                        I suspect that the deleteLater() function is not allowed to be called on a stack variable but to confirm I (probably) need to go through the QCoreApplication::postEvent() function which is too complicated to me as a user and not a Qt-developer.

                        No, delete is not allowed on a stack variable. You don't need to be a Qt developer to know this, and it has nothing to do with how you call the delete -- from the outside, from the inside (i.e. deleting this), through a custom event or without.

                        L Offline
                        L Offline
                        LRDPRDX
                        wrote on 8 Nov 2021, 13:02 last edited by
                        #18

                        @kshegunov said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                        You don't need to be a Qt developer to know this, and it has nothing to do with how you call the delete -- from the outside, from the inside (i.e. deleting this), through a custom event or without.

                        Agreed, but how do I know what the Qt::WA_DeleteOnClose actually does? One can guess it causes the call of delete on the variable but that was just not enough to me to be sure (and obviously I was looking for an answer in the wrong place in the source code). Anyway, now I've got the answer. Thank you.

                        K 1 Reply Last reply 8 Nov 2021, 13:09
                        1
                        • L LRDPRDX
                          8 Nov 2021, 13:02

                          @kshegunov said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                          You don't need to be a Qt developer to know this, and it has nothing to do with how you call the delete -- from the outside, from the inside (i.e. deleting this), through a custom event or without.

                          Agreed, but how do I know what the Qt::WA_DeleteOnClose actually does? One can guess it causes the call of delete on the variable but that was just not enough to me to be sure (and obviously I was looking for an answer in the wrong place in the source code). Anyway, now I've got the answer. Thank you.

                          K Offline
                          K Offline
                          kshegunov
                          Moderators
                          wrote on 8 Nov 2021, 13:09 last edited by kshegunov 11 Aug 2021, 13:16
                          #19

                          @LRDPRDX said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                          Agreed, but how do I know what the Qt::WA_DeleteOnClose actually does?

                          If you feel the name doesn't give it up, or isn't clear enough, I'd've suggested looking up in the documentation:
                          https://doc.qt.io/qt-5/qt.html#WidgetAttribute-enum

                          It's sort of the point of having documentation - so you don't need to go browsing through the code, and thankfully Qt has the best one I've ever seen.

                          Read and abide by the Qt Code of Conduct

                          L 1 Reply Last reply 8 Nov 2021, 13:17
                          1
                          • K kshegunov
                            8 Nov 2021, 13:09

                            @LRDPRDX said in double free or corruption (out) when closing a QDialog with the WA_DeleteOnClose attribute set:

                            Agreed, but how do I know what the Qt::WA_DeleteOnClose actually does?

                            If you feel the name doesn't give it up, or isn't clear enough, I'd've suggested looking up in the documentation:
                            https://doc.qt.io/qt-5/qt.html#WidgetAttribute-enum

                            It's sort of the point of having documentation - so you don't need to go browsing through the code, and thankfully Qt has the best one I've ever seen.

                            L Offline
                            L Offline
                            LRDPRDX
                            wrote on 8 Nov 2021, 13:17 last edited by
                            #20

                            @kshegunov Yes, ofc, I read that. For some reason I interpret the word "delete" (when it's not formatted :) ) as a general way to destroy an object. -_-

                            1 Reply Last reply
                            0
                            • L LRDPRDX
                              8 Nov 2021, 12:05

                              @jsulm I don't think so. As you see the output "After exec" is not present. So the error occurs before leaving the scope..

                              H Offline
                              H Offline
                              habeebo
                              wrote on 10 Feb 2023, 00:26 last edited by habeebo 2 Oct 2023, 01:12
                              #21

                              @LRDPRDX

                              In terminal, "double free or corruption (out)" message is printed after the destructor has been called.

                              Update: Sorry for bothering you. I was having similar issue. I saw your post in stackoverflow and then my problem solved when I allocated my QMainWindow object in heap instead of the stack.

                              Many thanks!

                              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