This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++17 status.

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

Section: 17.6.3 [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:

17.6.3.2 [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 17.6.3.3 [new.delete.array]/11, `operator delete[](void*, std::size_t)`.

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

Proposed resolution:

1. Change 17.6.3.2 [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 17.6.3.3 [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)`.