shared_ptr 的循环依赖问题
#include <memory>
#include <iostream>
using namespace std;
struct A;
struct B;
struct A {
shared_ptr<B> B_ptr;
A() {
cout << "construct A" << endl;
}
~A() {
cout << "destory A" << endl;
}
};
struct B {
shared_ptr<A> A_ptr;
B() {
cout << "construct B" << endl;
}
~B() {
cout << "destroy B" << endl;
}
};
void loop() {
shared_ptr<A> ap(new A()); // ap 的引用计数是1
shared_ptr<B> bp(new B()); // bp 的引用计数是1
cout << ap.use_count() << endl;
cout << bp.use_count() << endl;
ap -> B_ptr = bp; //bp的引用计数是2
bp -> A_ptr = ap; //ap的引用计数是2
cout << ap.use_count() << endl;
cout << bp.use_count() << endl;
// 将 ap 所指向的对象记作 Aobj,将bp所指向的对象记作 Bobj。
// 准备析构 bp, 此时Bobj的use_count 是 2,因此析构bp不会销毁 Bobj,而是使 Bobj的use_count变为1。
// 注意:此时 Aobj 的 use_count 是 2,一个来自 ap, 另一个来自 Bobj.A_ptr(记住:Bobj 并未被销毁)
// 同理析构 ap 只会把 ap的use_count变为 1 而不会销毁 Aobj。这样就造成内存泄漏了。
}
int main() {
loop();
return 0;
}
References
Circular dependency issues with std::shared_ptr, and std::weak_ptr
shared_ptr 的循环依赖问题的更多相关文章
- kmdjs和循环依赖
循环依赖 循环依赖是非常必要的,有的程序写着写着就循环依赖了,可以提取出一个对象来共同依赖解决循环依赖,但是有时会破坏程序的逻辑自封闭和高内聚.所以没解决好循环依赖的模块化库.框架.编译器都不是一个好 ...
- spring3 循环依赖
循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环.此处不 ...
- 在.NET Core中遭遇循环依赖问题"A circular dependency was detected"
今天在将一个项目迁移至ASP.NET Core的过程中遭遇一个循环依赖问题,错误信息如下: A circular dependency was detected for the service of ...
- seaJS循环依赖的解决原理
seajs模块的六个状态. var STATUS = { 'FETCHING': 1, // The module file is fetching now. 模块正在下载中 'FETCHED': ...
- RequireJS 循环依赖报 模块undefined 处理方案
RequireJS 循环依赖 开始学习使用RequireJS之后做了几个小例子,之后想着把手头的项目也用RequireJS写一遍试试.感觉胜利就在前方了,忽然发现始终卡在一个问题上: 很常见的一个问题 ...
- 剑指架构师系列-Struts2构造函数的循环依赖注入
Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...
- Spring的循环依赖问题
spring容器循环依赖包括构造器循环依赖和setter循环依赖,那Spring容器如何解决循环依赖呢?首先让我们来定义循环引用类: 在Spring中将循环依赖的处理分成了3种情况: 构造器循环依赖 ...
- Spring对加载的bean之间循环依赖的处理
根据下面文档的叙述,简言之: 对于相互之间通过构造函数注入相互循环依赖的情况,Spring会抛出BeanCurrentlyInCreationException错误. 如果AB两个beans是通过属性 ...
- DI 之 3.2 循环依赖 (伍)
3.2.1 什么是循环依赖 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA, ...
随机推荐
- PHP判断URL地址百度是否已经收录并主动提交MIP数据
/** * PHP检测URL地址百度是否已经收录 * @param string $url 要检测的URL地址 */ function Baidu($url) { $url = 'http://www ...
- 【php】php 生僻知识点认知
资料引用来源:http://www.runoob.com/php/php-tutorial.html 表单提交中, 变量名中的点和空格被转换成下划线.例如 <input name=" ...
- 深入理解is_callable和method_exists
一.函数解析 is_callable() 定义: (PHP 4 >= 4.0.6, PHP 5, PHP 7) is_callable — 检测参数是否为合法的可调用结构 bool is_cal ...
- Dynamics 365-下载新版本的开发工具
可以使用下面的Powershell脚本在NuGet下載最新的CRM开发工具.这些工具包括: Tool NuGet Package Code generation tool CrmSvcUtil.exe ...
- MySQL 从入门到删库
基本操作 登陆指令 mysql -u用户名 -p密码(可以非明文输入) -h主机/IP -D端口 --prompt 提示符 修改提示符 \D 日期 \d 当前数据库 \h 服务器名 \u 用户名 // ...
- android staido 断点遇到的坑
今天排查数据布点问题,发现sd卡上面的文件莫名消失. 怎么可能?系统不可能删除你的文件,但是我调试,删除文件的代码, 一直都没有执行啊. 后来发现,子线程里面代码,android stadio 可能断 ...
- 2018春季校园招聘笔经面经合集:Java开发岗
2018春季校园招聘笔经面经合集:Java开发岗 以下为精选面经: 美团外卖配送部后台开发面经 nowcoder.com/discuss/76 春招总结,干货满满 nowcoder.com/discu ...
- Linux上Makefile管理java项目
前面文章讲到了Linux上通过.spec文件与rpmbuild命令将java程序打包为RPM安装包, 现阶段遇到新的需求: 使用Makefile来操纵java的编译.打包 该需求以前面的内容为基础 可 ...
- 「日常训练」Single-use Stones (CFR476D2D)
题意(Codeforces 965D) $w$表示河的宽度,$l$表示青蛙所能跳的最远的距离,第二行的$w-1$个元素表示离河岸为$i$的地方有$a[i]$个石头,一个石头被踩两次,问最多有多少只青蛙 ...
- restAssured + TestNG测试接口,以下是一个get 请求。
package Elaine.Test.G.APITest; import org.testng.Assert;import org.testng.annotations.BeforeTest;imp ...