c++智能指针详解

本文详细介绍了C++智能指针的原理和应用,包括为何需要智能指针、智能指针的实现版本(如auto_ptr、unique_ptr、shared_ptr和weak_ptr)及其特点。重点讨论了shared_ptr的线程安全问题、循环引用以及weak_ptr如何解决这个问题,阐述了智能指针在资源管理中的重要性。

c++智能指针

为什么要有智能指针?

c++最令人失望的是没有资源回收功能,资源的回收依赖于显示定义的回收资源的函数。为了实现资源的自动回收,c++引入了一种能够近似自动回收的方法就是智能指针。

智能指针是基于一种叫做 RAII 的思想,(Resource Acquisition Is Initialization) 将资源的回收在定义变量的时候就设置好。智能指针的作用其实就是将资源的管理分配给每一个对象,随着对象的消亡而调用析构函数然后将资源粉碎掉。

这样做的好处是:

1.不需要显示的释放资源

2.采用这种方式,对象所需的资源在其生命周期内始终有效。

智能指针有哪些实现版本

智能指针不应该只是一个对象,它还应该能够干指针能干的事情,比如说 * 解引用
和 -> 箭头,如果有需要的话还必须有 = 号功能。也就是说要对这些功能进行函数重载。

auto_ptr 的实现版本1


	template <class T>
    class AutoPtr
    {
   
   
    private:
    	T* _Ptr;
    public:
    	AutoPtr(T *ptr = nullptr) :_Ptr(ptr)
    	{
   
   
    	}
    	AutoPtr(const AutoPtr<T> &ap) :_Ptr(ap._Ptr)
    	{
   
   
    		ap._Ptr = nullptr;
    	}
    	AutoPtr<T> &operator = (const AutoPtr<T> &ap)
    	{
   
   
    		if (this != &ap)
    		{
   
   
    			delete this->_Ptr;
    			this->_Ptr = ap._Ptr;
    			ap._Ptr = nullptr;
    		}
    		return *this;
    	}
    	~AutoPtr()
    	{
   
   
    		delete _Ptr;
    	}
    	T& operator *()
    	{
   
   
    		if (_Ptr == nullptr)
    		{
   
   
    			throw ap;
    		}
    		return *_Ptr;
    	}
    	T& operator ->()
    	{
   
   
    		if (_Ptr == nullptr)
    		{
   
   
    			throw ap;
    		}
    		return _Ptr;
    	}
    };

在这里插入图片描述
以上auto_ptr的主要思想是,

1.资源只能被一个指针管理
2.如果使用一个管理了资源的指针去初始化另一个指针的话。那么管理资源的权限将会被转移。
3.转移过后的指针将会被赋予nullptr。也就是被悬空了。

以上存在的问题,如果空指针被错误的解引用会造成程序崩溃。

auto_ptr 的实现版本2

为了使得多个职能指针共同使用同一块空间,在以上的基础上做了一点改变。设立一个owner的bool变量,只有为true的owner才能够释放资源。使用拷贝构造函数或者赋值运算符时,会造成管理权限的转移。

    template <class T>
    class Auto_ptr{
   
   
    private:
    	mutable T * _ptr;
    	mutable	bool owner;
    public:
    	Auto_ptr(T *ptr = nullptr) :_ptr(ptr), owner(true)
    	{
   
   }
    	Auto_ptr(const Auto_ptr & ap) :_ptr(ap._ptr), owner(true)
    	{
   
   
    		if (this != &ap)
    		{
   
   
    			ap.owner = false;
    		}
    	}
    	Auto_ptr<T> & operator = (const Auto_ptr & ap)
    	{
   
   
    		if (this != &ap)
    		{
   
   
    			if 
### C++ 智能指针详解 #### 定义与作用 智能指针是一种类模板,用于管理动态分配的对象生命周期。通过自动处理对象的创建和销毁,智能指针能够有效防止内存泄漏和其他资源管理错误。 #### 类型介绍 C++标准库提供了三种主要类型的智能指针: - **unique_ptr** `std::unique_ptr` 是一种独占所有权的智能指针,不允许复制操作,但支持移动语义[^1]。 ```cpp std::unique_ptr<int> ptr(new int(10)); ``` - **shared_ptr** `std::shared_ptr` 实现了引用计数机制,允许多个指针共享同一个对象实例。当最后一个指向该对象的 `shared_ptr` 被销毁或重置时,所管理的对象也会被删除[^2]。 ```cpp auto sptr = std::make_shared<int>(20); ``` - **weak_ptr** `std::weak_ptr` 不增加引用计数,通常作为辅助工具配合 `shared_ptr` 使用,主要用于解决循环引用问题[^3]。 ```cpp std::weak_ptr<int> wptr(sptr); ``` #### 应用场景示例 假设有一个简单的工厂模式实现,其中涉及到了不同种类的产品生产。为了简化代码并提高安全性,可以采用智能指针来代替原始裸指针。 ```cpp #include <memory> #include <iostream> // 基础产品接口定义 struct Product { virtual ~Product() {} virtual void use() const = 0; }; // 具体产品的实现之一 struct ConcreteProductA : public Product { void use() const override { std::cout << "Using product A\n"; } }; // 工厂函数返回智能指针而非普通指针 std::unique_ptr<Product> create_product_a() { return std::make_unique<ConcreteProductA>(); } int main() { // 自动管理内存,无需手动delete auto prod = create_product_a(); prod->use(); return 0; } ``` 上述例子展示了如何利用 `std::unique_ptr` 来安全地管理和传递堆上分配的对象,而不需要担心忘记释放资源的问题。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值