【14】智能指针shared_ptr和weak_ptr的关系

【1】原理及相关概念

(1) 强引用与弱引用
1)强引用:指针对对象存在拥有性,与对象具有相同的生命周期,指向的对象被注销了,该指针才被释放;一个强引用当被引用的对象活着的话,这个引用也存在(就是说,当至少有一个强引用,那么这个对象就不能被释放)
2)弱引用:指针对对象存在非拥有性,对象的生命周期与指针不同,不控制对象生命周期的智能指针,程序结束时自动被释放。弱引用当引用的对象活着的时候不一定存在。仅仅是当它存在的时候的一个引用。弱引用并不修改该对象的引用计数,这意味这弱引用它并不对对象的内存进行管理,在功能上类似于普通指针,然而一个比较大的区别是,弱引用能检测到所管理的对象是否已经被释放,从而避免访问非法内存。

(2)weak_ptr
1)weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 进行该对象的内存管理的是那个强引用的 shared_ptr. weak_ptr只是提供了对管理对象的一个访问手段.
  2)weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少.
  3)weak_ptr也是一个引用计数型智能指针,但是它不增加对象的引用计数,即弱引用。与之相对,shared_ptr是强引用,只要有一个指向对象的shared_ptr存在,该对象就不会析构,直到指向对象的最后一个shared_ptr析构或reset()时才会被销毁。
  
(3)成员函数
weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象. 注意, weak_ptr 在使用前需要检查合法性.
1)expired 用于检测所管理的对象是否已经释放, 如果已经释放, 返回 true; 否则返回 false.
2)lock 用于获取所管理的对象的强引用(shared_ptr). 如果 expired 为 true, 返回一个空的 shared_ptr; 否则返回一个 shared_ptr, 其内部对象指向与 weak_ptr 相同.
3)use_count 返回与 shared_ptr 共享的对象的引用计数.weak_ptr 支持拷贝或赋值, 但不会影响对应的 shared_ptr 内部对象的计数.
4)reset 将 weak_ptr 置空.

【2】代码

// AutoPtr.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <memory>

using namespace std;

int main()
{
	int* ptr = new int(10);//定义一个指针,并初始化
	int* ref = ptr;//将一个已经定义好的指针赋值给一个新的指针
	delete ptr;//释放原有指针的内存空间
	
	// empty definition
	std::shared_ptr<int> sptr; //定义一个共享指针	
	sptr.reset(new int);//为该共享指针重新分配内存
	*sptr = 10;//为该共享指针赋值

	std::weak_ptr<int> weak1 = sptr;//获取共享指针对象的弱指针1	
	sptr.reset(new int);//共享指针重新分配内存
	*sptr = 5;//为该共享指针赋值

	std::weak_ptr<int> weak2 = sptr;//获取共享指针对象的弱指针2	

	if (auto tmp = weak1.lock())//获取弱指针1管理对象的强引用
		std::cout << *tmp << '\n';
	else
		std::cout << "weak1 is expired\n";

	if (auto tmp = weak2.lock())//获取弱指针2管理对象的强引用
		std::cout << *tmp << '\n';
	else
		std::cout << "weak2 is expired\n";

	cout <<" shared_ptr 共享的对象的引用计数:" <<sptr.use_count() << endl;
	cout << " weak2的对象的值:" << *sptr.get() << endl;
	cout << " weak2的对象的地址:" << sptr.get() << endl; //只能用弱指针weak2的强指针sptr
	cout << " weak2的对象是否被释放:" << weak2.expired() << endl;//0  智能指针调用完成自动释放
	return 0;
}

【3】运行结果

在这里插入图片描述

【4】参考文献

C++智能指针 weak_ptr
Boost智能指针——weak_ptr

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值