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.3k 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: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 Offline
      J Offline
      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 Offline
          J Offline
          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