## SmartPtr class


Класс указателя для обёртывания типов, выделяемых в куче. Используйте его для управления памятью классов, наследующих [Object](../object/). Этот тип указателя следует семантике внедряемого указателя. Счётчик ссылок хранится либо в самом [Object](../object/), либо в структуре счётчика, тесно связанной с экземпляром [Object](../object/). В любом случае все экземпляры [SmartPtr](./) образуют единую группу владения независимо от того, как они были созданы, что отличается от поведения класса std::shared_ptr. Преобразование обычного указателя в [SmartPtr](./) безопасно, поскольку существуют другие экземпляры [SmartPtr](./), удерживающие совместные ссылки на тот же объект. Экземпляр класса [SmartPtr](./) может находиться в одном из двух состояний: shared pointer и weak pointer. Чтобы объект оставался живым, количество совместных ссылок на него должно быть положительным. Как weak, так и shared указатели могут использоваться для доступа к объекту (вызов методов, чтение или запись полей и т.д.), но weak указатели не участвуют в подсчёте ссылок shared указателя. [Object](../object/) удаляется, когда последний 'shared' [SmartPtr](./) указатель на него уничтожается. Поэтому убедитесь, что этого не происходит, когда нет других shared [SmartPtr](./) указателей на объект, например, во время конструирования или разрушения объекта. Используйте объекты‑сторожи System::Object::ThisProtector (в коде C++) или атрибуты CppCTORSelfReference и CppSelfReference (в переводимом коде C#), чтобы решить эту проблему. Аналогично, разорвите циклические ссылки, используя класс указателя [System::WeakPtr](../weakptr/) или режим указателя [System::SmartPtrMode::Weak](../smartptrmode/) (в коде C++) или атрибут CppWeakPtr (в переводимом коде C#). Если два или более объекта ссылаются друг на друга с помощью 'shared' указателей, они никогда не будут удалены. Если тип указателя (weak или shared) должен переключаться во время выполнения, используйте метод [System::SmartPtr<T>::set_Mode()](./set_mode/) или класс [System::DynamicWeakPtr](../dynamicweakptr/). Класс [SmartPtr](./) не содержит виртуальных методов. Наследовать его следует только если вы разрабатываете собственную стратегию управления памятью. Этот тип представляет собой указатель для управления удалением другого объекта. Его следует размещать в стеке и передавать в функции по значению или по константной ссылке.

```cpp
template<class T>class SmartPtr
```


| Параметр | Описание |
| --- | --- |
| T | Тип указываемого объекта. Должен быть либо [System::Object](../object/), либо его подкласс. |
## Методы

| Метод | Описание |
| --- | --- |
| [begin](./begin/)() | Аксессор метода [begin()](./begin/) базовой коллекции. Компилируется только если [SmartPtr_](./smartptr_/) является специализированным типом с методом [begin()](./begin/). |
| [begin](./begin/)() const | Аксессор метода [begin()](./begin/) базовой коллекции. Компилируется только если [SmartPtr_](./smartptr_/) является специализированным типом с методом [begin()](./begin/). |
| [Cast](./cast/)() const | Преобразует указатель к его собственному типу. |
| [Cast](./cast/)() const | Преобразует указатель к базовому типу с помощью static_cast. |
| [Cast](./cast/)() const | Преобразует указатель к производному типу с помощью dynamic_cast. |
| [Cast](./cast/)() const | Преобразует указатель к производному типу с помощью dynamic_cast. |
| [cbegin](./cbegin/)() const | Доступ к методу [cbegin()](./cbegin/) базовой коллекции. Компилируется только если [SmartPtr_](./smartptr_/) является специализированным типом с методом [cbegin()](./cbegin/). |
| [cend](./cend/)() const | Доступ к методу [cend()](./cend/) базовой коллекции. Компилируется только если [SmartPtr_](./smartptr_/) является специализированным типом с методом [cend()](./cend/). |
| [const_pointer_cast](./const_pointer_cast/)() const | Преобразует указатель к другому типу с помощью const_cast над объектом, на который он указывает. |
| [dynamic_pointer_cast](./dynamic_pointer_cast/)() const | Преобразует указатель к другому типу с помощью dynamic_cast над объектом, на который он указывает. |
| [end](./end/)() | Доступ к методу [end()](./end/) базовой коллекции. Компилируется только если [SmartPtr_](./smartptr_/) является специализированным типом с методом [end()](./end/). |
| [end](./end/)() const | Доступ к методу [end()](./end/) базовой коллекции. Компилируется только если [SmartPtr_](./smartptr_/) является специализированным типом с методом [end()](./end/). |
| [get](./get/)() const | Получает объект, на который указывает указатель. |
| [get_Mode](./get_mode/)() const | Получает режим указателя. |
| [get_shared](./get_shared/)() const | Получает объект, на который указывает указатель, но проверяет, что указатель находится в режиме shared. |
| [get_shared_count](./get_shared_count/)() const | Получает количество существующих shared‑указателей на объект, на который ссылаются, включая текущий. Проверяется, что текущий указатель находится в режиме shared. |
| [GetHashCode](./gethashcode/)() const | Вызывает [GetHashCode()](./gethashcode/) у объекта, на который указывает указатель. |
| [GetObjectNotNull](./getobjectnotnull/)() const | Получает текущий объект, на который есть ссылка (если есть), или бросает исключение. |
| [GetObjectOrNull](./getobjectornull/)() const | Получает объект, на который указывает указатель (если есть), или nullptr. То же, что и [get()](./get/). |
| [GetObjectOwner](./getobjectowner/)() const | Получает объект, на который есть ссылка. |
| [GetPointer](./getpointer/)() const | Получает объект, на который указывает указатель (если есть), или nullptr. То же, что и [get()](./get/). |
| [Is](./is/)(const System::TypeInfo\&) const | Проверяет, является ли объект, на который указывает указатель, конкретным типом или его дочерним типом. Соответствует семантике C# 'is'. |
| [IsAliasingPtr](./isaliasingptr/)() const | Проверяет, указывает ли указатель на объект, отличный от собственного (созданный конструктором алиасинга). |
| [IsShared](./isshared/)() const | Проверяет, находится ли указатель в режиме shared. |
| [IsWeak](./isweak/)() const | Проверяет, находится ли указатель в режиме weak. |
| explicit [operator bool](./operatorbool/)() const | Проверяет, что указатель не равен null. |
| [operator!](./operator!/)() const | Проверяет, что указатель равен null. |
| [operator*](./operator_/)() const | Получает ссылку на объект, на который указывает указатель. Проверяется, что указатель не равен null. |
| [operator->](./operator-_/)() const | Позволяет обращаться к членам объекта, на который есть ссылка. |
| [operator<](./operator_/)(Y *) const | Обеспечивает семантику сравнения на меньше для класса [SmartPtr](./). |
| [operator<](./operator_/)(SmartPtr\<Y\> const\&) const | Обеспечивает семантику сравнения на меньше для класса [SmartPtr](./). |
| [operator=](./operator=/)(SmartPtr_\&&) | Перемещающее присваивание объекту [SmartPtr](./). x становится непригодным. |
| [operator=](./operator=/)(const SmartPtr_\&) | Копирующее присваивание объекту [SmartPtr](./). |
| [operator=](./operator=/)(const SmartPtr\<Q\>\&) | Копирующее присваивание объекту [SmartPtr](./). Выполняет необходимые преобразования типов. |
| [operator=](./operator=/)(Pointee_ *) | Присваивает сырой указатель объекту [SmartPtr](./). |
| [operator=](./operator=/)(std::nullptr_t) | Устанавливает значение указателя в nullptr. |
| [operator==](./operator==/)(std::nullptr_t) const | Проверяет, указывает ли указатель на nullptr. |
| [operator[]](./operator[]/)(IdxType) const | Доступ к элементам массива. Компилируется только если [SmartPtr_](./smartptr_/) является специализацией [System::Array](../array/). |
| [RemoveAliasing](./removealiasing/)() const | Удаляет алиасинг (созданный конструктором алиасинга) из указателя, гарантирует, что он управляет (если shared) или отслеживает (если weak) тот же объект, на который указывает. |
| [reset](./reset/)(Pointee_ *) | Устанавливает указываемый объект. |
| [reset](./reset/)() | Заставляет указатель указывать на nullptr. |
| [set_Mode](./set_mode/)(SmartPtrMode) | Устанавливает режим указателя. Может изменять счётчики ссылок у целевого объекта. |
| [SetContainedTemplateWeakPtr](./setcontainedtemplateweakptr/)(uint32_t) const | Вызывает метод SetTemplateWeakPtr() у указываемого объекта (если он есть). |
| [SmartPtr](./smartptr/)(SmartPtrMode) | Создаёт объект [SmartPtr](./) требуемого режима. |
| [SmartPtr](./smartptr/)(std::nullptr_t, SmartPtrMode) | Создаёт объект [SmartPtr](./) с нулевым указателем требуемого режима. |
| [SmartPtr](./smartptr/)(Pointee_ *, SmartPtrMode) | Создаёт [SmartPtr](./), указывающий на указанный объект, или преобразует сырой указатель в [SmartPtr](./). |
| [SmartPtr](./smartptr/)(const SmartPtr_\&, SmartPtrMode) | Копирующее конструирование объекта [SmartPtr](./). Оба указателя указывают на один и тот же объект после этого. |
| [SmartPtr](./smartptr/)(const SmartPtr\<Q\>\&, SmartPtrMode) | Копирующее конструирование объекта [SmartPtr](./). Оба указателя указывают на один и тот же объект после этого. Выполняет преобразование типов, если разрешено. |
| [SmartPtr](./smartptr/)(SmartPtr_\&&, SmartPtrMode) | Перемещающее конструирование объекта [SmartPtr](./). По сути, меняет местами два указателя, если они находятся в одинаковом режиме. x может стать непригодным после вызова. |
| explicit [SmartPtr](./smartptr/)(const SmartPtr\<Array\<Y\>\>\&, SmartPtrMode) | Преобразует тип ссылочного массива, создавая новый массив другого типа. Полезно, если в C# есть приведение типа массива, которое не поддерживается в C++. |
| explicit [SmartPtr](./smartptr/)(const Y\&) | Инициализирует пустой массив. Используется для преобразования некоторых конструкций кода C#. |
| [SmartPtr](./smartptr/)(const SmartPtr\<P\>\&, Pointee_ *, SmartPtrMode) | Конструирует [SmartPtr](./), который разделяет информацию о владении с исходным значением ptr, но содержит несвязанный и неуправляемый указатель p. |
| [static_pointer_cast](./static_pointer_cast/)() const | Преобразует указатель к другому типу с помощью static_cast на указываемом объекте. |
| [ToObjectPtr](./toobjectptr/)() const | Преобразует любой тип указателя в указатель на [Object](../object/). Не требует, чтобы тип [Pointee_](./pointee_/) был полным. |
| static [Type](./type/)() | Сокращение для получения объекта [System::TypeInfo](../typeinfo/) для типа [Pointee_](./pointee_/) . |
| [~SmartPtr](./~smartptr/)() | Уничтожает объект [SmartPtr](./). При необходимости уменьшает счётчик ссылок указываемого объекта и удаляет объект. |
## Typedefs

| Типовое определение | Описание |
| --- | --- |
| [ArrayType](./arraytype/) | То же, что и [Pointee_](./pointee_/), если это специализация [System::Array](../array/), иначе — void. |
| [Pointee_](./pointee_/) | Тип, на который указывает. |
| [SmartPtr_](./smartptr_/) | Тип специализированного умного указателя. |
| [ValueType](./valuetype/) | Тип хранилища указываемого массива. Имеет смысл только если T является специализацией [System::Array](../array/). |

## См. также

* Namespace [System](../)
* Library [Aspose.PDF for C++](../../)
