C++:智能指针

智能指针与普通指针用法相似,但智能指针可以在适当的时机自动释放内存。

三种智能指针shared_ptr、unique_ptr和weak_ptr。

内存资源管理不当:

1.资源已被释放,但指针未赋空——野指针

2.二次释放

3.未及时释放

使用智能指针可以避免忘记释放内存而导致的内存泄漏问题。

智能指针的本质是类(类模板),是对普通指针的封装。

头文件<memory>

#include<iostream>
#include<memory>
using namespace std;


int main()
{
	int* p = nullptr;
	shared_ptr<int> sp;
	{
		shared_ptr<int> sp(new int(100));//<指向的类型>
		*sp = 200;
		cout << *sp << endl;
		p = sp.get();
	}

	cout << *p << endl;//根据*p的值,我们可知空间已经自动释放


	return 0;
}
#include<iostream>
#include<memory>
using namespace std;


int main()
{
	int* p = nullptr;
	shared_ptr<int> sp1;
	{
		shared_ptr<int> sp(new int(100));
		*sp = 200;
		cout << *sp << endl;
		p = sp.get();
		sp1 = sp;
	}
	sp1.reset();//释放,若无此行代码*p=200,因为shared_ptr采用计数机制,值为0时释放空间

	cout << *p << endl;

	
	return 0;
}
{
	unique_ptr<int> up(new int(100));
	cout << *up << endl;
	p = up.get();
}
cout << *p << endl;
shared_ptr<int> sp(new int(100));
weak_ptr<int> wp(sp);
weak_ptr<int> wp1(sp);
shared_ptr<int> sp1 = sp;

cout << wp.use_count() << endl;//2

cout << *wp.lock() << endl;//100

总结: 

  • shared_ptr:是一种共享所有权的智能指针,它可以被多个 shared_ptr 对象共享。它使用引用计数来跟踪有多少个 shared_ptr 指向同一个对象,当引用计数为 0 时,关联的对象会被自动删除。
  • unique_ptr:是一种独占所有权的智能指针,它确保在其生命周期结束时,关联的对象会被自动删除。它不能被复制或共享,只能通过移动语义来转移所有权
  • weak_ptr:是一种弱引用的智能指针,它指向一个由 shared_ptr 管理的对象,但不会增加引用计数。weak_ptr 主要用于检查所管理的资源是否已经被释放,以及协助 shared_ptr 防止循环引用。weak_ptr可以通过lock函数获取到shared_ptr,如果所管理的对象已经被销毁,会返回一个空的shared_ptr。还可以通过expired函数检查所管理的资源是否存在,如果不存在返回true。

注意:智能指针不是线程安全的,在多线程环境下使用智能指针要注意以下几点:

  • 一个线程拥有了指针所有权之后,不要让其他线程使用该指针。
  • 当使用一个指针时,需要使用锁来保护该指针。
  • 不要让一个指针在一个线程中 delete,而在另一个线程中访问它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值