моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Smart Pointer — это инструмент на C++, используемый для автоматического управления динамически выделяемой памятью.
Это класс, который инкапсулирует функции необработанных указателей и может автоматически обрабатывать выделение и освобождение ресурсов, тем самым помогая программистам избежать распространенных ошибок управления памятью, таких как утечки памяти, висячие указатели и другие проблемы.
Интеллектуальные указатели работают через механизм инициализации сбора ресурсов (RAII), который означает, что интеллектуальные указатели получают ресурсы при их создании и освобождают ресурсы при их уничтожении. Это гарантирует правильное высвобождение ресурсов даже в аномальных обстоятельствах.
(1) Утечка памяти: память освобождается вручную, но ее можно освободить автоматически с помощью интеллектуальных указателей.
(2) Распространение и выпуск указателей общего владения, например проблемы уничтожения, когда несколько потоков используют один и тот же объект.
Стандартная библиотека C++ предоставляет несколько типов интеллектуальных указателей, в том числе:
std::unique_ptr
:
unique_ptr
Экземпляр имеет исключительное право собственности на объект, на который он указывает.unique_ptr
Когда он выходит за пределы области видимости или явно сбрасывается, он автоматически вызывает деструктор и освобождает управляемый объект.std::shared_ptr
:
shared_ptr
Экземпляры совместно владеют одним и тем же объектом.shared_ptr
количество.shared_ptr
Когда экземпляр выходит за пределы области видимости или сбрасывается, счетчик ссылок уменьшается до нуля, вызывается деструктор объекта и объект освобождается.std::weak_ptr
:
shared_ptr
Проблема циклической ссылки.shared_ptr
управляемые объекты, но не участвует в управлении их жизненным циклом.shared_ptr
Когда экземпляр указывает на объект,weak_ptr
Может обнаружить, что объект был уничтожен.Разработка и использование интеллектуальных указателей значительно упрощает управление памятью в C++ и повышает надежность и безопасность программы. В современном программировании на C++ настоятельно рекомендуется использовать интеллектуальные указатели вместо необработанных указателей, чтобы улучшить качество и удобство сопровождения кода.
Интеллектуальные указатели используются в C++ как средство автоматического управления динамически выделяемой памятью для предотвращения утечек памяти и других проблем, связанных с управлением ресурсами.
std::unique_ptr
Примерstd::unique_ptr
— это интеллектуальный указатель с исключительным правом владения, который гарантирует, что существует только одинstd::unique_ptr
Экземпляр имеет контроль над данным ресурсом.когдаstd::unique_ptr
Когда он выходит за пределы области действия или сбрасывается, ресурсы, которыми он владеет, будут автоматически освобождены.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个unique_ptr来管理MyClass的实例
- std::unique_ptr<MyClass> uptr(new MyClass());
-
- // 调用doSomething方法
- uptr->doSomething();
-
- // unique_ptr会在离开作用域时自动调用MyClass的析构函数
- return 0;
- }
std::shared_ptr
Примерstd::shared_ptr
— это интеллектуальный указатель с совместным владением, который позволяет несколькимstd::shared_ptr
Экземпляры совместно владеют одним и тем же ресурсом.std::shared_ptr
Используйте счетчик ссылок, чтобы отслеживать, сколько интеллектуальных указателей указывают на один и тот же ресурс. Когда счетчик ссылок достигает 0, ресурс освобождается.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个shared_ptr来管理MyClass的实例
- std::shared_ptr<MyClass> sptr(new MyClass());
-
- // 创建第二个shared_ptr,共享同一个MyClass实例
- std::shared_ptr<MyClass> sptr2 = sptr;
-
- // 调用doSomething方法
- sptr->doSomething();
-
- // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
- return 0;
- }
В использованииstd::shared_ptr
При этом будьте осторожны, чтобы избежать ситуаций циклических ссылок, которые приведут к тому, что счетчик ссылок никогда не упадет до 0, что приведет к утечкам ресурсов.В случае циклических ссылок вы можете использоватьstd::weak_ptr
разорвать порочный круг,std::weak_ptr
Не увеличивает счетчик ссылок, а только сохраняетstd::shared_ptr
Управляйте слабыми ссылками на ресурсы.
В этих примерах показано, как использовать интеллектуальные указатели для управления динамически выделяемой памятью, чтобы гарантировать правильное высвобождение ресурсов в нужное время и избежать распространенных ошибок, которые могут возникнуть при ручном управлении памятью.
https://www.cnblogs.com/god-of-death/p/17962676
https://zhuanlan.zhihu.com/p/678722914