Boost库 --- 四种智能指针

Boost库 --- 四种智能指针智能指针基本思想:智能指针:主要有Boost库中的智能指针和STL标准库中的智能指针构成auto_ptr unique_ptr(引入前在boost库中叫做scope_ptr) shared_ptr weak_ptr其中auto_ptr为C++11标准之前拥有,但是auto_ptr问题很大,所以在C++11标准后引入了三种boost...
摘要由CSDN通过智能技术生成

Boost库 --- 四种智能指针

智能指针基本思想:

 

智能指针:主要有Boost库中的智能指针和STL标准库中的智能指针构成

  • auto_ptr
  • unique_ptr(引入前在boost库中叫做scope_ptr)
  • shared_ptr
  • weak_ptr

其中auto_ptr为C++11标准之前拥有,但是auto_ptr问题很大,所以在C++11标准后引入了三种boost库中的智能指针unique_ptr,shared_ptr,以及weak_ptr

 

智能指针基本思想:手动开辟内存,然后让系统进行释放

我们一一来介绍:

所有智能指针编写代码时都需要注意的事:

  1. 智能指针编写的时候,因为不知道指向的是何种类型的堆内存,所以都写成模板形式
  2. 注意智能指针的构造以及析构函数的编写
  3. 注意拷贝构造函数以及赋值运算符的重载函数的编写,这里可能导致多个智能指针指向同一块堆内存,防止同一块内存被多次释放导致系统崩溃。
  4. 普通指针含有的功能,我们一般也要给智能指针加上,比如*解引用功能以及->指向功能

 

我们根据上面几点一一开始介绍:

①:auto_ptr

特点:管理权唯一,释放权也唯一(拷贝构造和赋值的方式,都会导致原有的指针失效)

缺点:

  1. 不能多个对象同时访问这个内存,所以我们可以给里面添加一个标志位flag进行优化
  2. 类似于链表中,由于所有权的转移,导致某些指针在预期失效前就失效了
  3. 最重要一点,auto_ptr不能管理对象数组,因为auto_ptr的析构函数中是delete而不是delete[],当然这里我们可以进行模板的特例化对其进行优化

 

auto_ptr代码如下:

/*
//加了标志位bool flag的版本
template<typename T>
class Smart_ptr
{
public:
	Smart_ptr(T* ptr) :mptr(ptr)
	{
		flag = true;
	}
	Smart_ptr(const Smart_ptr<T>& rhs)
	{
		mptr = rhs.mptr;
		flag = rhs.flag;
		rhs.flag = false;
	}
	Smart_ptr<T>& operator= (const Smart_ptr<T>& rhs)
	{
		if(this != &rhs)
		{
			this->~Smart_ptr();//手动调用析构函数
			mptr = rhs.mptr;
			flag = rhs.flag;
			rhs.flag = false;

		}
		return *this;
	}
	~Smart_ptr()
	{
		if(flag == true)
		{
			delete mptr;
		}
		mptr = NULL;
	}
	T& operator* ()
	{
		return *mptr;
	}
	T* operator-> ()
	{
		return mptr;
	}
private:
	T* mptr;
	mutable bool flag;
};

*/

/*
//最初始版本
//auto_ptr 简化版
template <typename T>
class Smart_ptr
{
public:
	Smart_ptr(T* ptr) :mptr(ptr){}
	~Smart_ptr()
	{
		delete mptr;
		mptr = NULL;
	}
	Smart_ptr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boost提供了多种智能指针,用于管理动态分配的内存,避免内存泄漏和悬挂针等问题。下面是使用Boost智能指针的一般步骤: 1. 首先,确保你已经安装了Boost,并将其包含在你的项目中。 2. 在需要使用智能指针的文件中,包含相应的头文件。例如,如果你想使用shared_ptr,可以包含<boost/shared_ptr.hpp>。 3. 使用适当的智能指针类型来声明你的针变量。例如,使用shared_ptr来管理一个对象的动态分配内存: ``` boost::shared_ptr<MyClass> ptr(new MyClass()); ``` 这将创建一个shared_ptr对象ptr,并将其初始化为向一个新分配的MyClass对象。 4. 如果需要,可以通过reset()函数重新分配智能指针所管理的对象: ``` ptr.reset(new MyClass()); ``` 这将释放ptr当前管理的对象,并将其重新分配为一个新的MyClass对象。 5. 可以像使用原始针一样使用智能指针,通过箭头运算符(->)访问成员函数和成员变量: ``` ptr->someFunction(); ptr->someVariable = 10; ``` 6. 当不再需要智能指针时,它们会自动释放所管理的对象。你也可以显式地将智能指针设置为nullptr来释放对象: ``` ptr = nullptr; ``` 这将释放ptr当前管理的对象,并将其重置为nullptr。 7. 如果需要,可以使用智能指针的拷贝构造函数和赋值运算符来共享针的所有权。例如,可以将一个shared_ptr赋值给另一个shared_ptr,这样它们将共享同一个对象: ``` boost::shared_ptr<MyClass> ptr2 = ptr; ``` 这样,ptr和ptr2都向同一个MyClass对象,并共享其所有权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值