智能指针——unique_ptr、weak_ptr

1.shared_ptr

unique_ptr也有于shared_ptr相同的用法:
p、*p、p->get()、swap(),详情参见shared_ptr

1.特性

  • 某一时刻,只能有一个unique_ptr指向一个给定的对象
  • 当unique_ptr被销毁,,它所指向的对象也被销毁
  • 不能用make_shared,而是要将其绑定在一个new返回的指针上。
unique_ptr<int> p2(new int(42));	
  • 不支持普通的拷贝和赋值

错误示范:

int main()
{
	unique_ptr<string> p1(new string("asdfg"));
	unique_ptr<string> p2(p1);
	unique_ptr<string> p3;
	p3 = p2;
	return 0;
}

2.reset()和release()

  • reset();放弃对象并释放
  • reset(q);指向q
  • u.release();释放对象,返回指针,并将u滞空

代码演示:

int main()
{
	//realease正确用法
	unique_ptr<string> p1(new string("asdfg"));
	unique_ptr<string> p2(p1.release());
	cout << *p2 << endl;

	//realease错误示范,p2不会释放内存,并丢失指针
	unique_ptr<string> p3(new string("123456"));
	p3.release();

	//reset正确示范
	p2.reset();
	unique_ptr<string> p4(new string("123456"));
	p2.reset(p4.release());//实现拷贝
	return 0;
}

3.特殊的拷贝和赋值

即将销毁的unique_ptr可以使用普通的拷贝赋值

unique_ptr<string> fun1(string p)
{
	return unique_ptr<string>(new string(p));
}

unique_ptr<string> fun2(string p)
{
	unique_ptr<string> ret(new string(p));
	return ret;
}

int main()
{
	//realease正确用法
	unique_ptr<string> p1(fun1("I Love You!"));
	unique_ptr<string> p2(fun2("MeeTo!"));

	cout << "你:" + *p1 << endl;
	cout << "你的女神:" + *p2 << endl;
	return 0;
}

4.向unique_ptr传递删除器

(没太理解,所以直接贴原书内容,日后补全)
在这里插入图片描述

2.weak_ptr

在这里插入图片描述
weak必须有一个shared来初始化
eg:

auto p1 = make_shared<int>(42);
weak_ptr<int> p2(p1);
auto p1 = make_shared<int>(42);
	weak_ptr<int> p2(p1);

	cout << p1.use_count() << endl;

在这里插入图片描述
输出一下p1的引用次数发现p1的引用次数依旧是1,得出结论:weak_ptr不会增加shared_ptr的引用次数
但是如果p1被释放了,我们再调用p2肯定会出现错误,所以我们那不能直接调用它。应该这样:

	if(shared_ptr<int> a = p2.lock())
	{
    
    
		//。。。。。。。
	}

猜你喜欢

转载自blog.csdn.net/qq_43679333/article/details/107987374
今日推荐