C++ 智能指针

C++智能指针用于更安全地管理动态分配的对象,防止内存泄漏。本文重点讨论shared_ptr和weak_ptr。shared_ptr允许多个指针共享同一对象,自动管理引用计数,适用于参数传递和函数返回。而weak_ptr是一个弱引用,不改变引用计数,用于解决shared_ptr的循环引用问题。

C++ 智能指针

为了更安全地使用动态对象,标准库定义了两个只能指针类型来管理动态分配的对象当一个对象应该被释放时,指向它的智能指针可以确保自动地把它释放。
理论上来说,一共有三个类型:

shared_ptr
unique_ptr
weak_ptr

本文主要介绍shared_ptrweak_ptr


简介

shared_ptr允许多个指针指向同一个对象。
unique_ptr则“独占”所指向的对象。
weak_ptr是一个弱引用,指向由shared_ptr管理的对象,但是不改变引用计数


shared_ptr

首先要介绍make_shared()函数,顾名思义就是在动态内存中分配一个对象,并返回shared_ptr,说白了就是让一段动态内存让shared_ptr去管理,使用的时候对特定类型构造时必须与其构造函数相匹配,例如:

shared_ptr<int> p = make_shared<int>(1);

shared_ptr允许多个指针指向同一个对象,并且还有一个与之关联的引用计数

C++智能指针是一种工具,用于提供更安全、简单和方便的内存管理方式。它实际上是一种对象,内部管理着一个指向动态分配内存块的指针智能指针的实现依赖于C++的RAII(资源获取即初始化)技术,在对象构造时分配资源,析构时释放资源,以此确保资源正确使用 [^2]。 智能指针将动态分配的内存块与一个或多个智能指针对象相关联,确保内存块在不再需要时自动释放。通常会把内存所有权转移到自身对象,并在析构函数中释放内存,避免常见的内存泄漏和释放非法内存等问题。实现时常用引用计数技术,每个智能指针对象有计数器记录引用同一内存块的对象数量,引用计数为0时释放内存。不过引用计数可能存在循环引用问题,为此C++11引入了`weak_ptr`来解决 [^2]。 C++中定义了4种智能指针:`auto_ptr`、`unique_ptr`、`shared_ptr`和`weak_ptr`,其中`auto_ptr`在C++11被摒弃,C++17中移除不可用 [^4]。以下是几种常用智能指针的使用方法: ### 自定义智能指针示例 ```cpp #include <iostream> template <typename T> class MyPointer{ private: T* pointer_; public: MyPointer(T *p): pointer_(p){ } ~MyPointer(){ delete pointer_; std::cout << "pointer_ destroy."; } }; int main(){ MyPointer<int> p(new int(10)); } ``` 此示例展示了简单自定义智能指针的实现,利用类对象出作用域自动调用析构函数的特点,在析构函数中进行内存回收 [^1]。 ### unique_ptr智能指针 `unique_ptr`是一种独占式智能指针,同一时间只能有一个`unique_ptr`指向某个对象,当它被销毁时,所指向的对象也会被销毁。 ```cpp #include <iostream> #include <memory> int main() { std::unique_ptr<int> p1(new int(10)); // 判断是否为空 if (p1) { std::cout << *p1 << std::endl; } // 修改智能指针所有权 std::unique_ptr<int> p2 = std::move(p1); if (!p1 && p2) { std::cout << *p2 << std::endl; } return 0; } ``` ### shared_ptr智能指针 `shared_ptr`采用引用计数技术,多个`shared_ptr`可以指向同一个对象,当引用计数为0时,对象被销毁。 ```cpp #include <iostream> #include <memory> int main() { std::shared_ptr<int> p1(new int(10)); std::shared_ptr<int> p2 = p1; std::cout << p1.use_count() << std::endl; // 输出引用计数 return 0; } ``` ### weak_ptr智能指针 `weak_ptr`是一种弱引用智能指针,它不控制对象的生命周期,主要用于解决`shared_ptr`的循环引用问题。 ```cpp #include <iostream> #include <memory> class B; class A { public: std::shared_ptr<B> b_ptr; ~A() { std::cout << "A destroyed" << std::endl; } }; class B { public: std::weak_ptr<A> a_ptr; ~B() { std::cout << "B destroyed" << std::endl; } }; int main() { std::shared_ptr<A> a = std::make_shared<A>(); std::shared_ptr<B> b = std::make_shared<B>(); a->b_ptr = b; b->a_ptr = a; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值