6 Basic concepts [basic]

6.7 Storage duration [basic.stc]

6.7.4 Dynamic storage duration [basic.stc.dynamic] Safely-derived pointers [basic.stc.dynamic.safety]

A traceable pointer object is

A pointer value is a safely-derived pointer to a dynamic object only if it has an object pointer type and it is one of the following:

An integer value is an integer representation of a safely-derived pointer only if its type is at least as large as std​::​intptr_­t and it is one of the following:

An implementation may have relaxed pointer safety, in which case the validity of a pointer value does not depend on whether it is a safely-derived pointer value. Alternatively, an implementation may have strict pointer safety, in which case a pointer value referring to an object with dynamic storage duration that is not a safely-derived pointer value is an invalid pointer value unless the referenced complete object has previously been declared reachable ([util.dynamic.safety]). [Note: The effect of using an invalid pointer value (including passing it to a deallocation function) is undefined, see [basic.stc.dynamic.deallocation]. This is true even if the unsafely-derived pointer value might compare equal to some safely-derived pointer value. end note] It is implementation-defined whether an implementation has relaxed or strict pointer safety.

This section does not impose restrictions on indirection through pointers to memory not allocated by ​::​operator new. This maintains the ability of many C++ implementations to use binary libraries and components written in other languages. In particular, this applies to C binaries, because indirection through pointers to memory allocated by std​::​malloc is not restricted.