[basic.stc.dynamic.safety] (original) (raw)

6 Basics [basic]

6.7 Memory and objects [basic.memobj]

6.7.5 Storage duration [basic.stc]

6.7.5.4 Dynamic storage duration [basic.stc.dynamic]

6.7.5.4.3 Safely-derived pointers [basic.stc.dynamic.safety]

A traceable pointer object is

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

An integer value is an integer representation of a safely-derived pointeronly 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].

This is true even if the unsafely-derived pointer value might compare equal to some safely-derived pointer value.

end note

]

It isimplementation-defined whether an implementation has relaxed or strict pointer safety.

This subclause 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.