【转】g_object_weak_ref的意义和用途

【java.lang.ref】SoftReference & WeakReference 目录 零、前情概要 ref包内容 系列目录 上一章回顾 一、WeakReference 适用场景 测试案例 应用举例 三、SoftReference 适用场景 量化软引用“内存紧张”条件 测试验证 总结 零、前情概要 1.java.lang.ref包的内容 Reference & ReferenceQueue & ReferenceHandler SoftReference & WeakReference P.. 阅读详情

原文:http://blog.youkuaiyun.com/absurd/archive/2007/01/17/1486048.aspx

 


g_object_weak_ref的
意义和用途

 

转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/absurd

作者联系方式:Li XianJing <xianjimli at hotmail dot com>

更新时间:2007-1-17

 

引用计数是控制对象生命周期常用的手法,对象初始引用计数为一,引用一次计数加一,反引用一次计数减一,直到计数降为零时,对象被销毁。GObject也实现了引用计数机制,g_object_ref函数用于引用,增加引用计数。g_object_unref函数用于反引用,减少引用计数。

 

GObject还提供了另外两个函数: g_object_weak_ref/g_object_weak_unref。weak_ref直译过来是弱引用,但它们的意义并不是很直观,新手常常很迷惑,本文介绍它们的意义和用途。我们先看看它们的函数原型:

void        g_object_weak_ref             (GObject        *object,

                           GWeakNotify     notify,

                           gpointer        data);

void        g_object_weak_unref           (GObject        *object,

                           GWeakNotify     notify,

                           gpointer        data);

 

与g_object_ref/g_object_unref相比,g_object_weak_ref/g_object_weak_unref的原型要复杂许多,而且也看不出它们与引用有何关系。但从文档和代码可以很容易知道,g_object_weak_ref的功能就是注册一个回调函数,该函数将在对象被销毁时调用。

 

这与引用有什么关系呢?我们用一个例子说明:

 

在短信应用中,假设我们只允许一个写短信的窗口存在。要进入写短信界面,第一次创建写短信窗口,并把窗口句柄保存起来。这相当于引用了该窗口,但是我们不能调用g_object_ref去增加窗口的引用计数,原因是没适当的时候去反引用它,这会导致窗口无法关闭。

 

第二次进入时,先判断保存的窗口句柄是否为空,如果不为空,则认为窗口已经打开,直接把它提到前面来即可。

 

窗口不存在就创建它,存在就重用它,保证只有一个写短信的窗口存在。但上面的逻辑是有漏洞的:假设写完短信,用户通过正当或者不正当的手段关闭该窗口。窗口已经关闭了,但外面还保存着它的句柄,这个窗口句柄指向无效的内存,若仅仅以保存的窗口句柄是否为空,来判断窗口是否已经打开,就必然会出现错误。

 

窗口本身并不知道外面是否保存了它的句柄,它不可能在销毁时去把保存的句柄置为空。怎么办呢?最简单的办法就利用g_object_weak_ref,向窗口注册一个回调函数,窗口在销毁时调用该回调函数,在回调函数中,可以把保存的窗口句柄置为空。

 

简单的说:g_object_weak_ref让引用者有机会知道,引用的对象是否已经无效了,这可以防止野指针的出现。对于窗口对象,要模拟实现g_object_weak_ref的功能,其实有好几种方法:比如用GTK_IS_WIDGET判断窗口是否还有效、用g_object_set_data_full注册回调函数,或者注册GtkObject的destroy信号等。当然,只有g_object_weak_ref是名正言顺的,也只有它是最简单的。

 

~~end~~

 

SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference) Jerry前一篇文章 SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析 介绍了在ABAP里判断引用变量是否包含了一个有效引用的关键字:IS BOUND. 本文则从ABAP和Java编程语言里不同的引用类型这个角度来继续引用这个话题的讨论。 不知道大家留意过这个ABAP抽象类CL_ABAP_REFERENCE吗?这个抽象类只有一个GET方... 阅读详情

相关推荐

告别Godot默认编辑器:手把手教你用VSCode配置C#开发环境(附中文注释避坑指南)

本文详细介绍了如何将VSCode配置为Godot引擎的C#开发环境,提升游戏开发效率。从环境准备、扩展配置到解决中文编码问题,提供完整的避坑指南和高级调试技巧,帮助开发者充分利用VSCode的智能补全和调试功能,打造高效工作流。

weixin_30596023的博客 188

GstElementr的创建和释放

GstElement中的创建和释放 GstElement GstElement是一个抽象的基类。 GObject ╰──GInitiallyUnowned ╰──GstObject ╰──GstElement 所有elemetn都继承于GstElement,element用于构建pipeline。codec、mux/demux、filter等插件实际上都是一个 GstElement对象。element可以通过gst_element_factory_make

技术笔记 1606

EMC工程师职业发展:从测试整改到系统设计的进阶之路

电磁兼容(EMC)是确保电子设备在复杂电磁环境中可靠工作的关键技术,其核心在于控制电磁干扰(EMI)并提升抗扰度。其基本原理涉及电磁场理论、噪声耦合路径与滤波屏蔽技术。对于电子产品而言,EMC设计直接关系到能否通过CE、FCC等强制性认证,是产品上市和市场竞争力的关键。在工程实践中,EMC工程师需要从电路设计、PCB布局、元器件选型等源头入手,将EMC要求融入产品开发全流程,实现从后期“整改”到前期“设计预防”的价值跃迁。本文聚焦EMC工程师的核心能力体系构建与职业发展路径,深入探讨了如何从掌握标准测试、电

weixin_30819085的博客 387

活用 g_object_weak_ref 避免 memory leak

这是一个常见又恼人的问题 – Memory Leak 内存泄漏。常见的情况是软件用一段时间后,内存使用量肥大,在许多功能复杂的软件之中,不免会看到这类的情形。不过我们不能完全怪罪软件设计者〔虽然他们还是占很重要的因素〕,对程序开发者来说,要达成完全 Leak-free ,几乎是不可能的事,因为除了自己写的程序之外,各种 system call 都有可能造成 memory leak 的发生〔如 pa

pp0xx0ww0的专栏 907

Unity地形数据高效转换:从Terrain到3DMAX的OBJ导出实战

本文详细解析了Unity地形数据无法直接导入3DMAX的原因,并提供了高效转换的实战方案。通过编写自定义编辑器脚本,将Unity Terrain的高度图数据“烘焙”为静态网格模型,并以OBJ格式导出。文章重点讲解了核心代码逻辑、分辨率选择对模型精度的影响,以及在3DMAX中导入和优化模型的实用技巧,旨在打通Unity与3DMAX之间的数据协作壁垒。

sky77的博客 447

cadence数模混合仿真反标sdf

数模混合IC设计时经常要调用一些Verilog模块(最简单的例如SPI接口),在前仿时一般直接用rtl代码来仿真,但是后仿时要关注因寄生带来的延迟,避免这些额外的延迟导致时序错误,因此不能简单地采用RTL来仿真。 一般有两种办法:1是采用由RTL综合得到的门级电路来仿真,这种方法比较简单,但是缺点是规模较大,而且只包括门延迟不包括因版图导致的线延迟;如果想要仿真更精细,就要对该这部分门电路提取寄生参数; 另一种方式是利用sdf文件(standard delay format)来进行仿真。后端工具在布局布

长河柱天的博客 7273

g_object_weak_ref的意义和用途

g_object_weak_ref的意义和用途 转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/absurd作者联系方式:Li XianJing 更新时间:2007-1-17 引用计数是控制对象生命周期常用的手法,对象初始引用计数为一,引用一次计数加一,反引用一次计数减一,直到计数降为零时,对象被销毁。GObject也实现了引用计数机制,g_obj

国产开源 GUI 引擎 AWTK 5126

避开SiC MOSFET驱动设计的3个大坑:电流/电阻/电压配置全指南

本文深入解析SiC MOSFET驱动设计中的三大关键参数:驱动电流、栅极电阻和工作电压,揭示常见设计误区与优化方案。通过实际案例与数据对比,指导工程师避开第三代电力电子半导体应用中的典型陷阱,提升系统可靠性与效率。特别针对驱动电源配置、栅极电阻选型等核心问题提供可落地的解决方案。

weixin_29214199的博客 382

g_object_weak_ref的意义和用途[zt]

g_object_weak_ref的意义和用途 转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/absurd作者联系方式:Li XianJing <xianjimli at hotmail dot com>更新时间:2007-1-17 引用计数是控制对象生命周期常用的手法,对象初始引用计数为一,引用一次计数加一,反引用一次计数减一,直到计...

weixin_33709364的博客 191

Java网页访问报错?手把手教你解决JRE插件缺失和浏览器拦截问题(附详细截图)

本文针对Java网页访问时常见的JRE插件缺失和浏览器拦截问题,提供了详细的诊断与解决方案。文章首先解释了问题根源在于现代浏览器出于安全考虑停止了对Java插件的支持,然后手把手指导用户确认Java安装、在控制面板配置安全站点列表,并针对Chrome、Edge、Firefox等主流浏览器的不同拦截机制给出了具体的应对策略,最后提供了系统性的故障排查清单,帮助用户彻底解决访问障碍。

weixin_29233857的博客 219

600份国家自然基金申报书--模板

600份国家自然基金申报书--模板

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 4186

Python weakref --- 弱引用详解

在 Python 中,内存管理是一个重要的话题。`weakref` 模块提供了弱引用的功能,它允许我们在不增加对象引用计数的情况下引用对象,从而避免影响对象的垃圾回收机制。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 2126

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

gst_object_ref和gst_object_ref_sink区别

理解Glib中的引用和浮引用是掌握GObject对象内存管理的关键。下面我将为你梳理这两个核心概念。

我的博客 574

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

GObject参考手册(9)--GObject的内存管理

 本文引用自http://imtx.cn,原文作者:TualatriX  原文:http://library.gnome.org/devel/gobject/2.14/gobject-memory.html GObject的内存管理相关的API有一点复杂,但是背后的主旨是相当简单的:它的目的是提供一个灵活的基于引用计数的、可以集成在使用或需要各种不同的内存管理模型(就像垃圾回收)的应用程序

wjx_sy的专栏 1149

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

c++ 智能指针- shared_ptr和weak_ptr

c++中智能指针的作用是非常大的,它不仅能解决很多裸指针带来的内存相关问题,还能用来管理资源(RAII)。 c++中的智能指针有很多种,其中以shared_ptr和weak_ptr最为重要(个人观点),掌握了这两个智能指针的原理,其它的就很好理解了。 shared_ptr是典型的引用计数型智能指针,相信很多c++程序员都写过功能类似的智能指针类。很多时候用这个指针就足够了。 但是有些

hp_truth的专栏 4082

weak soft Phantom ref

weak soft Phantom ref 常规的就不说了, 说说自己的理解方式 weak soft 相当于是可以将没有friendly strong ref的对象,只有容器(map set arr 等)引用的对象,进行自动回收。 反过来说,weak ref‘s friendly strong ref =null了,它依然可以拿到对象,只要该对象还没有被gc掉 当然 weak 的o

G7N3F的博客 591

【Java.lang.ref】ref包简述

零、API documentation java.lang.ref API documentation:https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/ref/package-summary.html other documentation:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.ht..

厚积薄发者,轻舟万重山 1563

Java持有引用,java.lang.ref类库

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34326429的博客 423

OSError: [WinError 1455] 页面文件太小,无法完成操作和AttributeError: ‘NoneType‘ object has no attribute ‘_free_wea

OSError: [WinError 1455] 页面文件太小,无法完成操作和AttributeError: ‘NoneType‘ object has no attribute ‘_free_wea

qq_38230414的博客 1045

G1垃圾回收器步骤

4443.554: [GC pause (G1 Evacuation Pause) (young), 0.0061966 secs] [Parallel Time: 4.2 ms, GC Workers: 8] [GC Worker Start (ms): Min: 4443554.1, Avg: 4443554.2, Max: 4443554.2, Diff: 0.1] [Ext Root Scanning (ms): Min: 1.1, Avg: 1.2, Max: 1..

1205

GObject对象系统(5) 对象内存管理

 Object memory management The memory-management API for GObjects is a bit complicated but the idea behind it is pretty simple: the...

chudaiao7567的博客 884
上一篇: 【转】GTK编程——构件的显现、映射和显示
下一篇: 【转】gtk_object_sink的妙处
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值