6 Basic concepts [basic]

6.7 Storage duration [basic.stc]

6.7.4 Dynamic storage duration [basic.stc.dynamic]

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

А traceable pointer object это

  • объект object pointer type, или

  • объект интегрального типа размером не менее std​::​intptr_­t, или

  • последовательность элементов в массиве narrow character type, где размер и выравнивание последовательности соответствуют таковым у некоторого типа указателя на объект.

Значение указателя является safely-derived pointer динамическим объектом, только если он имеет тип указателя на объект и является одним из следующих:

  • значение, возвращаемое вызовом реализации стандартной библиотеки C ++ ​::​operator new(std​::​​size_­t) или ​::​operator new(std​::​size_­t, std​::​align_­val_­t);40

  • результат взятия адреса объекта (или одного из его подобъектов), обозначенного lvalue в результате косвенного обращения через безопасно полученное значение указателя;

  • результат четко определенной арифметики указателя ([expr.add]) с использованием безопасно полученного значения указателя;

  • результат четко определенного преобразования указателя ([conv.ptr], [expr.cast]) безопасного значения указателя;

  • результат reinterpret_­cast безопасного получения значения указателя;

  • результат reinterpret_­cast целочисленного представления безопасного значения указателя;

  • значение объекта, значение которого было скопировано из отслеживаемого объекта-указателя, где во время копирования исходный объект содержал копию безопасно полученного значения указателя.

Целочисленное значение является значением integer representation of a safely-derived pointer только в том случае, если его тип не меньше размера, std​::​intptr_­t и это одно из следующих значений:

  • результат reinterpret_­cast безопасного получения значения указателя;

  • результат действительного преобразования целочисленного представления безопасного значения указателя;

  • значение объекта, значение которого было скопировано из отслеживаемого объекта-указателя, где во время копирования исходный объект содержал целочисленное представление безопасно полученного значения указателя;

  • результат аддитивной или побитовой операции, один из операндов которой является целочисленным представлением безопасно полученного значения указателя P, если этот результат, преобразованный с помощью, reinterpret_­cast<void*> будет сравниваться с безопасным полученным указателем, вычисляемым из reinterpret_­cast<void*>(P).

Реализация может иметь relaxed pointer safety, и в этом случае действительность значения указателя не зависит от того, является ли это безопасным значением указателя. В качестве альтернативы, реализация может иметь strict pointer safety, и в этом случае значение указателя, относящееся к объекту с длительностью динамического хранения, которое не является безопасным значением указателя, является недопустимым значением указателя, если указанный полный объект не был ранее объявлен достижимым ([util.dynamic.safety]). [ Note: Эффект от использования недопустимого значения указателя (включая передачу его в функцию освобождения) не определен, см [basic.stc.dynamic.deallocation]. Это верно, даже если значение указателя, полученное небезопасно, может сравниться с некоторым значением указателя, полученным безопасным способом. ] Это определяется реализацией, имеет ли реализация ослабленную или строгую безопасность указателя. end note

Этот раздел не налагает ограничений на косвенное обращение через указатели к памяти, не выделенной ​::​operator new. Это поддерживает способность многих реализаций C ++ использовать двоичные библиотеки и компоненты, написанные на других языках. В частности, это относится к двоичным файлам C, потому что косвенное обращение через указатели к памяти, выделенной им std​::​malloc , не ограничено.