1. 程式人生 > >活用 g_object_weak_ref 避免 memory leak

活用 g_object_weak_ref 避免 memory leak

這是一個常見又惱人的問題 – Memory Leak 記憶體洩漏。常見的情況是軟體用一段時間後,記憶體使用量肥大,在許多功能複雜的軟體之中,不免會看到這類的情形。不過我們不能完全怪罪軟體設計者〔雖然他們還是佔很重要的因素〕,對程式開發者來說,要達成完全 Leak-free ,幾乎是不可能的事,因為除了自己寫的程式之外,各種 system call 都有可能造成 memory leak 的發生〔如 pango〕。

不過話說回來,system 裡各種 library 所造成的 memory leak 畢竟還是少量,軟體開發者所造成的問題佔著大多數,一個真實的例子:從 Firefox 每次 release 就一直在修正 memory leak 就可以發現修也修不完。

來探討 memory leak 的形成原因,顧名思義就是漏水,記憶體外漏產生了無法控制的記憶體區塊。舉個簡單的例子:

void func()

{

  char *p;

 p = (char *)malloc(12);

  p = (char *)malloc(10);

 free(p);

}

此例的程式程式碼會出現 12 bytes 的 memory leak,因為第一次 malloc 取得的記憶體區塊未被釋放。換句話說,在第二次 malloc 之後,我們已經失去前一次記憶體區塊的地址了,該區塊對我們來說,已經是再也無法控制的記憶體區塊〔因為不知道地址〕,但他仍然會在程式結束前活在那。如此一來,要是我們重複呼叫此 function ,每次都會造成 12 bytes 的浪費。

當然,這是明顯可以看出 memory leak 存在的例子,有很多情況是很難發現問題的,尤其是在結構複雜的程式中。

有一個情況是這樣,在 Gtk+ 程式的設計中,常會臨時建立一個 structure 傳給 Widget event 的 callback function,程式程式碼大致如下:

s = malloc(struct cb_s);

g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(cb_func), s);

和傳統的程式不同,我們不能在 g_signal_connect 之後就用 g_free() 去釋放 s,因為在 menu_item 這 Widget 銷燬之前,我們都有可能因事件觸發而使用到 s。所以,這時就要用到一個特別的 g_object function:

void g_object_weak_ref(GObject *object, GWeakNotify notify, gpointer data);

這 g_object function 可以設定 object 被銷燬後,將會呼叫什麼 GWeakNotify function 做一些後續處理的動作。通常必需是自己設計一個 function 來呼叫,就如同 g_signal_connect 的 callback function 那樣。不過在這例子中,可以有個漂亮的特殊用法:

g_object_weak_ref(menu_item, g_free, s);

將 Glib 的 g_free 當做 GWeakNotify function 來使用,是一個很漂亮的方式。在 menu_item destroy 之後,便會使用 g_free 將 s 給釋放掉。如此就不會在,Widget 銷燬後因為 s 而產生 memory leak 了

相關推薦

g_object_weak_ref 避免 memory leak

這是一個常見又惱人的問題 – Memory Leak 記憶體洩漏。常見的情況是軟體用一段時間後,記憶體使用量肥大,在許多功能複雜的軟體之中,不免會看到這類的情形。不過我們不能完全怪罪軟體設計者〔雖然他們還是佔很重要的因素〕,對程式開發者來說,要達成完全 Leak-free

TOJ4114(樹狀數組)

namespace return 統計 關系 max 按位計算 處理 們的 保存 TOJ指天津大學onlinejudge 題意:給你由N個數組成的數列,算出它們的所有連續和的異或和,比如:數列{1,2},則answer = 1 ^ 2 ^ (1 + 2) = 0。 這道題有

WPF WebBrowser Memory Leak 問題及臨時解決方法

exce step lose rpe quest 不同 程序啟動 round collect 首先介紹一下內存泄漏(Memory Leak)的概念,內存泄露是指程序中已動態分配的堆內存由於某種原因未釋放或者無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重

css,半星星的效果

span face spl pan white pla java light line 1、首先下載要用到星星字體 http://www.w3cplus.com/w3cplusDemo/demos/webFontIcon.html 2、css .cleanfloa

利用linux的mtrace命令定位內存泄露(Memory Leak)

常常 linux 程序 popu bsp center std 如果 啟動 一談到內存泄露, 多數程序猿都聞之色變。 沒錯, 內存泄露非常easy引入。 但非常難定位。 以你我的手機為例(如果不常常關機)。 如果每天泄露一些內存, 那麽開始的一個星

【翻譯自mos文章】Windows平臺下的 Oraagent Memory Leak

style date any pat trac bytes issue processes ren 來源於: Oraagent Memory Leak (文檔 ID 1956840.1) APPLIES TO: Oracle Database - Ent

【前端閱讀】——《PHP、MySQL建構Web世界》摘記之設計技巧

簡化 return 下載 center src rto 響應 server pty 二、設計技巧 Programming的習慣因人而異,這裏只提供一些經驗,可以參考。 1、利用Include模塊化你的程序代碼 Include函數基本上說:就像是把另一個文件(HTM

零元學Expression Blend 4 - Chapter 26 教你如何使用RaidoButton以及布局容器的

off user scrollbar display back 找到 rect alt 新的 原文:零元學Expression Blend 4 - Chapter 26 教你如何使用RaidoButton以及布局容器的活用

LINQ to SQL(1):這要打破舊觀念

部分 res htm aac created 名稱 chang list utf 程序架構 如今比較經典的架構,看看以下圖片。 怎樣實現 在一個N層應用

JVM——Jvm內存結構

out 棧幀 連續 垃圾 VM 似的 pro 分配內存 java內存 Java內存結構:    JVM內存結構主要是有三大塊:堆內存、方法區和棧。堆內存是JVM中最大的一塊由年輕代和老年代組成,而年輕代內存又被分為三部分,Eden空間、From Survivor空間、To

JVM——類加載機制

java模塊化 throw framework 本地文件 dcl 也會 javac 限定 java 類的實例化過程 有父類的情況 1. 加載父類靜態 1.1 為靜態屬性分配存儲空間並賦初始值 1.2 執行靜態初始化塊和靜態初始化語句(從上至下)2. 加載

變量字符串${var%%.*}

活用變量字符串${var%%.*}很多時候在使用Linux的shell時,我們都需要對文件名或目錄名進行處理,通常的操作是由路徑中提取出文件名,從路徑中提取出目錄名,提取文件後綴名等等。例如,從路徑/dir1/dir2/file.txt中提取也文件名file.txt,提取出目錄/dir1/dir2,提取出文件

微信小程序 (node) warning: possible EventEmitter memory leak detected

音頻 TP eas AD warning 一起 list 可能 微信 小程序 (node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMax

Memory leak by misusing Autofac

ssi testin -a args run prop always nag public Recently I’ve found out that we can easily cause a memory leaks in our .net applicati

利用郵件激

view ger onf imp 客戶 quest 自定義 信息 confirm 一、安裝itsdangerous模塊 利用只有你自己知道的秘鑰來加密你的數據,然後把加密了的數據發給別人,取回數據時再利用已知的秘鑰來解密數據 pip install itsdangerou

零元學Expression Design 4 - Chapter 3 看小光被包圍了!!如何「Text On Path」設計效果

expr 彎曲 圖形 borde 快捷 att 簡單的 efault object 原文:零元學Expression Design 4 - Chapter 3 看小光被包圍了!!如何活用「Text On Path」設計效果

clone和trigger函式,點選按鈕原有事件不觸發,之後再觸發原有事件

活用clone和trigger函式,點選按鈕原有事件不觸發,之後再觸發原有事件 需求: 網站開發完畢了,然後產品說要在原來的’確認按鈕’點選後加一個’彈窗’提醒使用者一些注意事項,在使用者點選彈窗裡面的’同意按鈕’後再執行原來’確認按鈕’ 裡面繫結的事件。需求看起來很簡單,但是有一個要

歸併法的另類

歸併排序是OI中的一種常用方法,因為它藉助了對於兩個有序佇列,合併成一個有序佇列,只需要看隊頭,並以此達到O(n)的合併複雜度,至於分治只是活用它的一種方式罷了。 但是看隊頭的思想並不只侷限於佇列。 比如說醜數這個經典題: 對於一給定的素數集合 S = {p1, p2, …,

HDU1160 胖老鼠的速度 dp lis的,玄學改bug

題意大致就是:求出一個最長的重量遞增,速度遞減的序列,並記錄路徑,這道題本身並不難,只是lis的活用,難的是調bug!!!!,我改了兩天,怎末改都是WA,直到剛剛,我從g++換成了c++,就ac了,哭。 程式碼: #include<iostream> #include<

This is very likely to create a memory leak. Stack trace of thread錯誤分析

1、問題描述 啟動tomcat部署專案時,報This is very likely to create a memory leak. Stack trace of thread錯誤。 29-May-2018 12:30:09.322 SEVERE [localhos