Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. Is it possible to prevent `delete` on a `const *`?
Forum Updated to NodeBB v4.3 + New Features

Is it possible to prevent `delete` on a `const *`?

Scheduled Pinned Locked Moved Solved C++ Gurus
17 Posts 7 Posters 3.4k Views 4 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.
  • S SimonSchroeder
    10 Jun 2024, 08:41

    @JoeCFD said in Is it possible to prevent `delete` on a `const *`?:

    1. can call only const funcs

    delete does not only delete the contents something points to. It also calls the destructor of the underlying object. So, there is an inconsistency that I can call the destructor on a const object (which I never noticed in my long C++ career).

    Best advice is to not use plain owning pointers in C++. But, that would still leave you with the convention to use raw pointers as non-owning pointers with the technical possibility that someone calls delete on them. Making the delete operator private works to suppress this, but is also really intrusive to be of general use.

    J Offline
    J Offline
    JonB
    wrote on 10 Jun 2024, 08:47 last edited by JonB 6 Oct 2024, 13:12
    #8

    @SimonSchroeder said in Is it possible to prevent `delete` on a `const *`?:

    It also calls the destructor of the underlying object. So, there is an inconsistency that I can call the destructor on a const object (which I never noticed in my long C++ career).

    Exactly! I am "surprised" that you have never "noticed" this, as I most certainly have, and is precisely why I am so shocked it is allowed! :) I am finding this whole "you cannot change the object via const * but feel free to completely clobber it by deleting" very odd!

    J J 2 Replies Last reply 11 Jun 2024, 05:23
    0
    • J JonB has marked this topic as solved on 10 Jun 2024, 16:42
    • J JonB
      10 Jun 2024, 08:47

      @SimonSchroeder said in Is it possible to prevent `delete` on a `const *`?:

      It also calls the destructor of the underlying object. So, there is an inconsistency that I can call the destructor on a const object (which I never noticed in my long C++ career).

      Exactly! I am "surprised" that you have never "noticed" this, as I most certainly have, and is precisely why I am so shocked it is allowed! :) I am finding this whole "you cannot change the object via const * but feel free to completely clobber it by deleting" very odd!

      J Offline
      J Offline
      jsulm
      Lifetime Qt Champion
      wrote on 11 Jun 2024, 05:23 last edited by
      #9

      @JonB said in Is it possible to prevent `delete` on a `const *`?:

      I am finding this whole "you cannot change the object via const * but feel free to completely clobber it by deleting" very odd!

      Else, you would not be able to free the memory

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • J JonB
        10 Jun 2024, 08:47

        @SimonSchroeder said in Is it possible to prevent `delete` on a `const *`?:

        It also calls the destructor of the underlying object. So, there is an inconsistency that I can call the destructor on a const object (which I never noticed in my long C++ career).

        Exactly! I am "surprised" that you have never "noticed" this, as I most certainly have, and is precisely why I am so shocked it is allowed! :) I am finding this whole "you cannot change the object via const * but feel free to completely clobber it by deleting" very odd!

        J Offline
        J Offline
        J.Hilk
        Moderators
        wrote on 11 Jun 2024, 07:06 last edited by
        #10

        @JonB said in Is it possible to prevent `delete` on a `const *`?:

        I am finding this whole "you cannot change the object via const * but feel free to completely clobber it by deleting" very odd!

        freeing an objects memory is very much different from changing its internal state. const only prohibits the later


        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.

        J 1 Reply Last reply 11 Jun 2024, 08:38
        1
        • J J.Hilk
          11 Jun 2024, 07:06

          @JonB said in Is it possible to prevent `delete` on a `const *`?:

          I am finding this whole "you cannot change the object via const * but feel free to completely clobber it by deleting" very odd!

          freeing an objects memory is very much different from changing its internal state. const only prohibits the later

          J Offline
          J Offline
          JonB
          wrote on 11 Jun 2024, 08:38 last edited by
          #11

          @J-Hilk said in Is it possible to prevent `delete` on a `const *`?:

          freeing an objects memory is very much different from changing its internal state. const only prohibits the later

          Well it may be "different" but it is equally "destructive". And ends up "changing its internal state" as a consequence. Hence the discussion. I now get that "const only prohibits the later", and that's life, but I still find it "odd".

          1 Reply Last reply
          0
          • S Offline
            S Offline
            SimonSchroeder
            wrote on 12 Jun 2024, 06:22 last edited by
            #12

            I was just thinking about this: Is it possible to overload the delete operator with a const and non-const version?

            J 1 Reply Last reply 12 Jun 2024, 08:35
            0
            • S SimonSchroeder
              12 Jun 2024, 06:22

              I was just thinking about this: Is it possible to overload the delete operator with a const and non-const version?

              J Offline
              J Offline
              JonB
              wrote on 12 Jun 2024, 08:35 last edited by JonB 6 Dec 2024, 08:36
              #13

              @SimonSchroeder
              So for my case that would do what, presumably runtime error? I was looking for a compile-time error on attempting to delete a const pointer (like I would get on attempting to write to a member/call a non-const member method).

              J S 2 Replies Last reply 12 Jun 2024, 09:40
              0
              • J JonB
                12 Jun 2024, 08:35

                @SimonSchroeder
                So for my case that would do what, presumably runtime error? I was looking for a compile-time error on attempting to delete a const pointer (like I would get on attempting to write to a member/call a non-const member method).

                J Offline
                J Offline
                J.Hilk
                Moderators
                wrote on 12 Jun 2024, 09:40 last edited by
                #14

                @JonB make yourself a delete macro, that calls delete and setzt the pointer to nullptr :D


                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.

                J 1 Reply Last reply 12 Jun 2024, 10:23
                0
                • J J.Hilk
                  12 Jun 2024, 09:40

                  @JonB make yourself a delete macro, that calls delete and setzt the pointer to nullptr :D

                  J Offline
                  J Offline
                  JonB
                  wrote on 12 Jun 2024, 10:23 last edited by
                  #15

                  @J-Hilk My badly-behaved fellow programmers can/will call delete directly, and I want them to fall over at compile time as per trying to write into the const pointer!

                  1 Reply Last reply
                  0
                  • J JonB
                    12 Jun 2024, 08:35

                    @SimonSchroeder
                    So for my case that would do what, presumably runtime error? I was looking for a compile-time error on attempting to delete a const pointer (like I would get on attempting to write to a member/call a non-const member method).

                    S Offline
                    S Offline
                    SimonSchroeder
                    wrote on 13 Jun 2024, 06:30 last edited by
                    #16

                    @JonB said in Is it possible to prevent `delete` on a `const *`?:

                    So for my case that would do what, presumably runtime error?

                    If you can distinguish that, you could make the const-version private and the non-const public. So, you can still normally delete objects when you are allowed to (with a pointer to non-const). But I'm not sure if this distinction is possible.

                    C 1 Reply Last reply 13 Jun 2024, 06:48
                    0
                    • S SimonSchroeder
                      13 Jun 2024, 06:30

                      @JonB said in Is it possible to prevent `delete` on a `const *`?:

                      So for my case that would do what, presumably runtime error?

                      If you can distinguish that, you could make the const-version private and the non-const public. So, you can still normally delete objects when you are allowed to (with a pointer to non-const). But I'm not sure if this distinction is possible.

                      C Offline
                      C Offline
                      Chris Kawa
                      Lifetime Qt Champion
                      wrote on 13 Jun 2024, 06:48 last edited by Chris Kawa
                      #17

                      @SimonSchroeder said:

                      But I'm not sure if this distinction is possible

                      It's not. The delete operator can't be cv qualified.

                      Here's a fun quirk:

                      struct Foo {
                          void itIsFine() const { delete this; }
                          ~Foo() {  bar = 42; }
                          int bar = 0;
                      };
                      
                      const Foo* foo = new Foo();
                      foo->itIsFine();
                      

                      so not only can you delete an object through a pointer to const, but a const function can mutate the object without mutable or const_cast by deleting the object it is being called on;)

                      1 Reply Last reply
                      0

                      17/17

                      13 Jun 2024, 06:48

                      • Login

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