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: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