std::weak_ptr
weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象.
进行该对象的内存管理的是那个强引用的 shared_ptr.
weak_ptr只是提供了对管理对象的一个访问手段.
为了解决std::shared_ptr在相互引用的情况下出现的问题而存在的,
std::shared_ptr赋值给weak_ptr时,weak_ptr 支持拷贝或赋值,不会引起智能指针计数增加。
weak_ptr.lock() 获取所管理的对象的强引用(shared_ptr)
weak_ptr.use_count() 返回与 shared_ptr 共享的对象的引用计数.
weak_ptr.reset() 将 weak_ptr 置空
#include <cstdio>
#include <iostream>
#include <memory> using namespace std; struct Child;
typedef std::weak_ptr<Child> STChildWeakPtr; struct Father : public std::enable_shared_from_this<Father>
{
string say;
STChildWeakPtr ChildWeakPtr;
};
typedef std::weak_ptr<Father> STFatherWeakPtr; struct Child : public std::enable_shared_from_this<Child>
{
string say;
STFatherWeakPtr FathWeakPtr;
}; int main()
{
//创建zh指针
std::shared_ptr<Father> fa(new Father);
fa->say = "Iam father";
std::shared_ptr<Child> ch(new Child);
ch->say = "Iam Child"; //赋值给weak_ptr
fa->ChildWeakPtr = ch;
ch->FathWeakPtr = fa; //通过weak_ptr获取指针对象
std::shared_ptr<Father> ff = ch->FathWeakPtr.lock();
cout << ff->say <<endl; std::shared_ptr<Child> cc = fa->ChildWeakPtr.lock();
cout << cc->say << endl;
return ;
}
std::weak_ptr的更多相关文章
- 智能指针std::weak_ptr
std::weak_ptr 避免shared_ptr内存泄漏的利器.
- Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...
- 智能指针weak_ptr解决循环依赖问题
#include <iostream> #include <memory> class Woman; class Man{ private: std::weak_ptr< ...
- std::shared_ptr
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...
- C++ Primer : 第十二章 : 动态内存之unique_ptr和weak_ptr
unique_ptr 一个unique_ptr拥有它所管理的对象,与shared_ptr不同,unique_ptr指向的对象只能有一个用户.当unique_ptr被销毁后,它所指向的对象也被销毁. 定 ...
- Qt 智能指针学习(7种QT智能指针和4种std智能指针)
从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int arg ...
- C++ 11 创建和使用共享 weak_ptr
1.为什么需要weak_ptr? 在正式介绍weak_ptr之前,我们先来回忆一下shared_ptr的一些知识.我们知道shared_ptr是采用引用计数的智能指针,多个shared_ptr实例可以 ...
- c++——智能指针学习(shared_ptr和weak_ptr)
先看一个例子:Stark和Targaryen家族你中有我,我中有你.我们设计以下类企图避免内存泄漏,使得析构函数都能调用到: #include<iostream> #include< ...
随机推荐
- 基于GitHub Issues的评论系统--gitment
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 
最近公司需要ETH兑换功能,ETH转账需要区块打包,这个时候就需要区块检测,目前只是简单整合,后面会将区块自动检测代码上传致QQ群 对于区块链开发不太熟悉的童鞋,可以看看:[区块链开发(零)如何开始学 ...
- 【linux】【mysql】mysql8.0开启远程访问及常见问题
1.连接数据库 [root@localhost ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands e ...
- 45道CSS基础面试题(附答案)
1 .介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽 ...
- Linux虚拟机--进入MySQL报错的解决办法
在Linux安装MySQL有时候会出现 [mysql]ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/ ...
- Mysql 笔记(一)
InnoDB存储引擎 mysql 存储引擎(好难用,看https://www.zybuluo.com/eqyun/note/27850) 简介 InnoDB是事务安全的MySQL存储引擎,从MySQL ...
- selenium介绍及环境安装
selenium简介: seelenium是web应用程序自动化工具,通过自动操作浏览器,进行点击.输入.回车.返回等来模拟用户的真实行为.如何理解和看待selenium项目,selenium官方 ...
- SpringCloud搭建注册中心与服务注册
上一篇文章<微服务注册中心原理,看这篇就够了!>介绍了注册中心的概念和原理,本文将介绍下利用Eureka搭建中心并注册服务到注册中心的过程. 本文目录 一.Eureka介绍二.搭建注册中心 ...
- Spring 梳理 - filter、interceptor、aop实现与区别 -第二篇
spring mvc中的Interceptor可以理解为是Spring MVC框架对AOP的一种实现方式.一般简单的功能又是通用的,每个请求都要去处理的,比如判断token是否失效可以使用spring ...