2425. operator delete(void*, size_t) doesn't invalidate pointers sufficiently

Section: 21.6.2 [new.delete] Status: C++17 Submitter: Richard Smith Opened: 2014-08-29 Last modified: 2017-07-30

Priority: 0

View all other issues in [new.delete].

View all issues with C++17 status.

Discussion:

21.6.2.1 [new.delete.single]/12 says:

Requires: ptr shall be a null pointer or its value shall be a value returned by an earlier call to the (possibly replaced) operator new(std::size_t) or operator new(std::size_t,const std::nothrow_t&) which has not been invalidated by an intervening call to operator delete(void*).

This should say:

[…] by an intervening call to operator delete(void*) or operator delete(void*, std::size_t).

Likewise at the end of 21.6.2.2 [new.delete.array]/11, operator delete[](void*, std::size_t).

[Urbana 2014-11-07: Move to Ready]

Proposed resolution:

  1. Change 21.6.2.1 [new.delete.single]p12 as indicated:

    -12- Requires: ptr shall be a null pointer or its value shall be a value returned by an earlier call to the (possibly replaced) operator new(std::size_t) or operator new(std::size_t,const std::nothrow_t&) which has not been invalidated by an intervening call to operator delete(void*) or operator delete(void*, std::size_t).

  2. Change 21.6.2.2 [new.delete.array]p11 as indicated:

    -11- Requires: ptr shall be a null pointer or its value shall be the value returned by an earlier call to operator new[](std::size_t) or operator new[](std::size_t,const std::nothrow_t&) which has not been invalidated by an intervening call to operator delete[](void*) or operator delete[](void*, std::size_t).