C++智能指针详解

本文详细介绍了C++中的智能指针,包括std::auto_ptr、boost::scoped_ptr、boost::shared_ptr的使用和特性,强调了它们在内存管理中的作用,特别是如何避免内存泄漏。文章还提及了boost::scoped_array和boost::shared_array,以及为了解决引用计数问题的boost::weak_ptr。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

##1. 简介
由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,造成内存泄漏。
使用C++智能指针可以有效的解决这类问题,本文中主要介绍***std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr***,这六种指针的存在有效的解决new/delete问题。

2. 具体使用

我们首先编写的用来测试的类:

class Sample
{
public:
	Sample(size_t Num)
	{
		this->m_Num = Num;
		myString = "Sample";
		cout<<"Sample"<<endl;
	}
	~Sample()
	{
		cout<<"~Sample"<<endl;
	}
	void Print()
	{
		cout<<"Num is:"<<m_Num<<"   myString is:"<<myString.c_str()<<endl;
	}
public:
	size_t m_Num;
	string myString;
};

###1.std::auto_ptr
std::auto_ptr 属于 STL,当然在 namespace std 中,包含头文件 #include 便可以使用。std::auto_ptr 能够方便的管理单个堆内存对象
首先我们写一段代码进行分析:

void Test1()
{
	auto_ptr<Sample> au(new Sample(45));

if (au.get())    //判断指针是否为空
	{
		au->Print(); //调用输出函数
		au->myString += " is ";  //修改myString值
		au.get()->Print();      //调用打印函数
		au.get()->myString += "Called!!!"; //使用get获取对象指针来修改对象
		au->Print();        //打印
	}
}

运行结果如下:
这里写图片描述

代码中get函数可以获得对象的指针,我们来查看get的源码:

_Ty *get() const _THROW0()
		{	// return wrapped pointer
		return (_Myptr);
		}

从代码中可以看出返回资源对象的指针,即new 出来Sample对象的指针。
从运行结果中可以看出new 出来的对象已经得到正确释放。

void Test2()
{
	auto_ptr<Sample> au(new Sample(45));

	if (au.get())    //判断指针是否为空
	{
		au->Print(); //调用输出函数
		au->myString += " is ";  //修改myString值
		au.get()->Print();      //调用打印函数
		au.get()->myString += "Called!!!"; //使用get获取对象指针来修改对象
		au->Print();        //打印
		auto_ptr<Sample> other = au;  //赋值运算
		other->Print();   //new对象打印
		au->Print();     //old对象打印
	}
}

迫不及待来看看运行结果吧
这里写图片描述
哇哦,程序挂了,为甚么呢,我们来看看operator=的源码:

_Myt& operator=(auto_ptr_ref<_Ty> _Right) _THROW0()
		{	// assign compatible _Right._Ref (assume pointer)
		_Ty *_Ptr = _Right._Ref;
		_Right._Ref = 0;	// release old
		reset(_Ptr);	// set new
		return (*this);
		}

通过查看源码,恍然大悟,原来operator=在赋值过程中获取内存管理的控制权,将

### 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` 来安全地管理和传递堆上分配的对象,而不需要担心忘记释放资源的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值