## SmartPtr class


Класс‑указатель для обёртывания типов, выделяемых в куче. Используйте его для управления памятью классов, наследующих [Object](../object/). Этот тип указателя следует семантике внедрённых указателей. Счётчик ссылок хранится либо в самом [Object](../object/), либо в структуре счётчика, тесно связанной с экземпляром [Object](../object/). В любом случае все экземпляры [SmartPtr](./) образуют единую группу владения независимо от способа их создания, что отличается от поведения класса std::shared_ptr. Преобразование обычного указателя в [SmartPtr](./) безопасно, поскольку существуют другие экземпляры [SmartPtr](./), удерживающие совместные ссылки на тот же объект. Экземпляр класса [SmartPtr](./) может находиться в одном из двух состояний: совместный указатель и слабый указатель. Чтобы объект оставался живым, количество совместных ссылок на него должно быть положительным. И слабые, и совместные указатели могут использоваться для доступа к объекту (вызов методов, чтение или запись полей и т.д.), но слабые указатели не участвуют в подсчёте ссылок совместных указателей. [Object](../object/) удаляется, когда последний 'shared' указатель [SmartPtr](./) на него уничтожается. Поэтому убедитесь, что этого не происходит, когда нет других совместных указателей [SmartPtr](./) на объект, например, во время конструирования или разрушения объекта. Используйте охранные объекты System::Object::ThisProtector (в коде C++) или атрибуты CppCTORSelfReference и CppSelfReference (в переводимом коде C#), чтобы решить эту проблему. Аналогично, разорвите циклические ссылки, используя класс указателя [System::WeakPtr](../weakptr/) или режим указателя [System::SmartPtrMode::Weak](../smartptrmode/) (в коде C++) или атрибут CppWeakPtr (в переводимом коде C#). Если два или более объекта ссылаются друг на друга с помощью '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 | Получает указанный объект, но проверяет, что указатель находится в режиме совместного доступа. |
| [get_shared_count](./get_shared_count/)() const | Получает количество совместных указателей, существующих для ссылочного объекта, включая текущий. Проверяет, что текущий указатель находится в режиме совместного доступа. |
| [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 | Проверяет, находится ли указатель в режиме совместного доступа. |
| [IsWeak](./isweak/)() const | Проверяет, находится ли указатель в режиме слабой ссылки. |
| 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 | Удаляет алиасинг (созданный конструктором алиасинга) из указателя, гарантируя, что он управляет (если совместный) или отслеживает (если слабый) тот же объект, на который указывает. |
| [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.Page for C++](../../)
