C++ 智能指针

本文介绍了C++智能指针,在没有智能指针时堆内存管理易遗忘释放资源。C++中的智能指针有std::auto_ptr、std::unique_ptr、std::shared_ptr、std::weak_ptr。其中,std::auto_ptr在C++11中被遗弃,后三者各有特点,如std::unique_ptr语法更安全,std::shared_ptr为强引用,std::weak_ptr为弱引用。

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

C++ 智能指针

好记性不如烂笔头,有人问我C++智能指针是什么?我不太确定的给他说是auto_ptr。auto_ptr那么到底对不对呢?是对的,但也不全。那么智能 指针有哪些呢?在C++ 中智能指针有std::auto_ptr、std::unique_ptr 、std::shared_ptr、std::weak_ptr。

在没有智能指针的时候,我们对堆内存的管理就是简单的new / delete。这样我们往往会遗忘使用delete 去释放资源。因此智能指针就给我们提供了方便。

基础类

class Monster{
public:
	Monster(char *name):m_name(name)
	{
		cout<<m_name<<"	Constructor..."<<endl;
	}
	~Monster()
	{
		cout<<m_name<<"	DeConstructor..."<<endl;
	}
	void doSomething()
	{
		cout<<m_name<<"	doSomething..."<<endl;
	}
private:
	char *m_name;
};

std::auto_ptr

在C++11 以前最原始的智能指针是std::auto_ptr

在C++11中std::auto_ptr被遗弃了,替代它的是std::unique_ptr、std::shared_ptr、std::weak_ptr。

std::unique_ptr 一种强引用 指针

在语法上比std::auto_ptr更加安全(尝试复制unique_ptr是会在编译器报错,而auto_ptr能通过编译期从而在)运行期埋下出错的隐患)

std::unique_ptr 正如其名唯一的,因此它不允许拷贝,但它的独占权可以被转移使用std::move(std::unique_ptr对象)方法。

void example_fun2()
{
	std::unique_ptr<Monster> monster1(new Monster("monster1"));

	//std::unique_ptr<Monster> monster2 = monster1; // 报错unique_ptr声明的强引用不允许被复制
	std::unique_ptr<Monster> monster3 = std::move(monster1); //强引用指针所有权可以被转移使用std::move(std::unique_ptr)
	//monster1->doSomething(); //当unique_ptr强引用控制权被转移后,就不能再使用对象中的资源,在编译时不会报错,但在运行时候会出错
	monster3->doSomething();
}

std::shared_ptr 一种强引用指针

 多个shared_ptr指向 同一处资源,当所有shared_ptr都全部释放时, 该处资源才释放。

(有某个对象的所有权(访问权、生命控制权))即是强引用、所以shared_ptr是一种强引用型指针)

void example_fun3()
{
	std::shared_ptr<Monster> monster1(new Monster("monster1"));
	do{
		std::shared_ptr<Monster> monster2 = monster1;
	}
	while(0); 
	//monster1->doSomething();
	std::shared_ptr<Monster> monster3 = monster1;//多次复制强引用
	monster1->doSomething();
}

std::weak_ptr 一种弱引用指针

std::weak_ptr 是为了辅助std::shared_ptr的存在,它只提供了对管理毒性的访问手段,同时可以实时动态的知道指向的对象是否 存活。

只有某个对象的访问权,而没有它的生命控制权,即是弱引用。

void example_fun4()
{
	std::shared_ptr<Monster> monster1(new Monster("monster1"));
	std::weak_ptr<Monster> monster2 = monster1;
	//monster2->doSomething(); //Error!编译出错!weak_ptr没有重载*和->,无法直接当指针使用
	std::shared_ptr<Monster> monster3 = monster2.lock(); // 可以通过weak_ptr的lock方法获得shared_ptr.
	monster3->doSomething();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值