解决循环引用的一个例子

简介: 最近在讨论设计时注意到一个循环引用的问题。它是在使用引用计数指针时发生的。如下图所示: 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的接口。

如下图所示:

 

 

目录
相关文章
|
8月前
|
安全 程序员 编译器
C++ 引用本质
C++ 引用本质
38 0
|
1月前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
36 6
|
1月前
|
C++
c++引用是什么意思?
c++引用是什么意思?
10 2
|
1月前
|
存储 人工智能 编译器
【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义
【重学C++】【引用】一文看懂引用的本质与右值引用存在的意义
57 0
|
11月前
|
存储 数据库
如何解决循环引用的问题
解决循环引用的问题
137 0
|
8月前
|
Java
对象的相等和引用相等的区别
对象的相等和引用相等的区别
|
10月前
|
JavaScript
es 6 对象深拷贝的俩种方式
es 6 对象深拷贝的俩种方式
144 0
|
11月前
|
存储 编译器 C++
<c++> &引用概念 | 引用用法 | 引用与指针区别
<c++> &引用概念 | 引用用法 | 引用与指针区别
164 0
|
编译器 C语言 C++
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别(一)
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别
106 0
|
存储 安全 编译器
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别(二)
【是C++,不是C艹】 引用的概念 | 引用的使用 | 引用与指针的区别
70 0