This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 116a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2024-12-19


2757. Deleting or deallocating storage of an object during its construction

Section: 11.9.5  [class.cdtor]     Status: review     Submitter: Jiang An     Date: 2023-06-14

Subclause 6.7.4 [basic.life] paragraph 6 specifies:

... For an object under construction or destruction, see 11.9.5 [class.cdtor]. Otherwise, ...

However, the referenced subclause does not discuss deleting the object or deallocating its storage.

See also issue 2258.

Proposed resolution (reviewed by CWG 2023-10-20):

  1. Insert before 11.9.5 [class.cdtor] paragraph 2 as follows:

    During the initialization or destruction of an object, invoking the destructor for the object or releasing or reusing (6.7.4 [basic.life]) the storage which the object occupies results in undefined behavior. [ Note: Creating an object nested within some object o does not reuse the storage for o. -- end note ] [ Example:

      struct A() {
        A() {
          ::operator delete(this);
        }
      };
    
      A *p1 = new A;  // undefined behavior
    
      struct B() {
        B() {
          delete this;
        }
      };
    
      B *p2 = new B;  // undefined behavior
    
      struct S {
        constexpr S() { this->~S(); }
        constexpr S(int) {}
      };
    
      constexpr int f() {
        S s(0);
        s.~S();
        std::construct_at(&s);  // #1
        return 0;
      }
    
      constexpr int x = f();  // error: undefined behavior at #1
    

    -- end example ]

    During the construction of an object, if the value of the object ...

  2. Change in 11.9.5 [class.cdtor] paragraph 4 as follows:

    Member functions, including virtual functions (11.7.3 [class.virtual]), other than the destructor can be called during construction or destruction (11.9.3 [class.base.init]). When a virtual function (11.7.3 [class.virtual]) is called directly or indirectly from a constructor or from a destructor, including during the construction or destruction of the class's non-static data members, and ...