解决循环引用的一个例子

简介: 最近在讨论设计时注意到一个循环引用的问题。它是在使用引用计数指针时发生的。如下图所示: ClassA和ClassB分属两个不同的线程,ClassB通常由ClassA发起请求创建,并由ClassA使用,ClassB则会在必要时通知ClassA一些事件。

最近在讨论设计时注意到一个循环引用的问题。它是在使用引用计数指针时发生的。如下图所示:

ClassA和ClassB分属两个不同的线程,ClassB通常由ClassA发起请求创建,并由ClassA使用,ClassB则会在必要时通知ClassA一些事件。两者中各保留了对方的一个引用计数指针RefPtr。

如果在析构时释放成员变量的话,就会发生循环引用的问题,导致两个对象释放失败。

 

最直接的解决方法(不考虑弱引用指针)就是将释放指针的操作显示定义成函数,与析构函数分离开来,并在析构前确保调用这个函数来释放所使用的引用计数指针。定义一个clear函数来做这件事。为了有效释放使用的资源,在clear()中还可以做一些其它的清理操作: (下图是OwnerOfClassA对ClassA的释放过程,ClassB对应的操作相同)

 

但这时ClassA与ClassB耦合高,且双引用的情况最好针对轻量级的指针,以使资源使用效率提高。为此要将ClassA与ClassB解耦。一种方式就是使用一个代理,封装ClassB的实现。将原先的需要通知ClassA的事件使用观察者模式隐藏ClassA的接口。

如下图所示:

 

 

目录
相关文章
|
1月前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
33 6
|
1月前
|
C++
c++引用是什么意思?
c++引用是什么意思?
8 2
|
1月前
|
存储 人工智能 编译器
【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义
【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义
44 0
|
11月前
|
存储 数据库
如何解决循环引用的问题
解决循环引用的问题
134 0
|
8月前
|
Java
对象的相等和引用相等的区别
对象的相等和引用相等的区别
|
11月前
|
存储 编译器 C++
<c++> &引用概念 | 引用用法 | 引用与指针区别
<c++> &引用概念 | 引用用法 | 引用与指针区别
156 0
|
前端开发
前端学习案例1-weakMap的用法1弱引用
前端学习案例1-weakMap的用法1弱引用
53 0
|
存储 安全 编译器
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别(二)
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别
69 0
|
编译器 C语言 C++
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别(一)
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别
103 0
|
存储 安全 编译器

热门文章

最新文章