GTKMM的記憶體管理

2021-04-01 02:13:22 字數 1931 閱讀 5346

——讀 gtkmm tutorial 筆記。

by yazy, 2005-6-4

1、傳統 c++ 記憶體管理方式

1. 類作作用域內的構件

將構件宣告為類的成員變數,不使用動態記憶體分配機制。使用這種方式的優點是「memory

management is grouped in one place.」,隨著類的建立與銷毀,構件也隨之存在與消失。

// from the tutorial:

#include

class foo

;我用這種方式使用構件時出現問題。我從 gtk::window 繼承類 helloworld,並在helloworld

裡宣告兩個或者兩個以上的構件,比如 gtk::button 時,編繹出來的程式會 crash。折騰了好

久,未有的確結論。現在只猜測是堆疊益出(要求過多堆疊空間,系統未能滿足),因為從main

的第一行開始,我所有的物件都是在堆疊裡的,main 內容大致如下:

int main(...)

程式執行時上面 hello 將存在於堆疊中,其成員(複合型)也當然如此。若 helloworld 有

m_button1 及 m_button2 兩個成員,那它們也都存在於堆疊之中,所以我猜想我的程式

crashed 於堆疊益出。但是……乙個 gtk::button 物件會很大嗎?或者說兩個構件就足以用光整

個堆疊嗎?想到那幾成員構件的大小,我對自己這樣的猜測感到懷疑。我可以確認我的程式執行

之時記憶體還沒達到「高危」境況。

同樣的因堆疊要求過大而導致程式崩潰的情況我以前在 mfc 環境也遇到過。當我在乙個函式作

用域內一下子要求 2048 bytes 作為緩衝時,程式便垮了。直至我減小要求的緩衝大小,情況才

正常。此次的開發平台與當時不一樣,現在我用的是 mingw 的 gcc(3.4.2),不知道編繹平台的不

同會不會影響程式堆疊大小的不同。

當我將 helloworld 的幾個構件成員都換成堆物件(並將物件交由 gtkmm 託管,即下文出現的

內容)時,程式便不再煩人了。

2. 函式作用域內的構件

即在函式體內使用堆疊構件。這種方式的優點是「the increased data hiding and reduced

dependencies(提高了資料隱藏、減少了依賴性)」。同樣,如果堆疊大小有限,那這種方式

同樣也會使用程式崩潰。

3. 使用 new 和 delete 動態分配

使用堆物件,要求程式設計師手動地配對使用 new 和 delete,不然便會造成 memory leak。堆一

般認為是不會不夠用的,使用它的麻煩在於 new 和 delete 配對的麻煩,容易造成失誤。

2、託管構件

託管構件是使用 new 建立的堆構件,但對構件的記憶體**都交給 gtkmm 來完成(準確地說是容器

構件),所以程式設計師不必呼叫 delete,不必擔心配對問題。容器在自身銷毀之時會銷毀其管理之下的

子構件。

// from the tutorial:

mywidget::mywidget()

上面的 manage 是容器的方法,gtkmm的所有構件都有 set_manage 方法,可以將自己委託于父

構件:// from the tutorial:

foo.add( (w=new gtk::label("hello"), w->set_manage(), &w) );

// is the same as the following, but more tedious

foo.add( manage(new gtk::label("hello")) );

top level 容器不能成為其它容器的子構件,所以這類容器不能委託於「人」,如果使用將它們放於

堆中,我們必須考慮上面的問題。

Gtkmm在dev cpp下的配置

gtkmm 安裝1 首先安裝 dev cpp 2 然後安裝最新的 gtkmm2.4 來自http www.pcpm.ucl.ac.be gustin win32 ports index.html 在安裝過程中會自動檢測到沒有 gtk2.4 的開發環境 dev cpp 的主目錄中,如 d dev cp...

Gtkmm在dev cpp下的配置

gtkmm 安裝1 首先安裝 dev cpp 2 然後安裝最新的 gtkmm2.4 來自http www.pcpm.ucl.ac.be gustin win32 ports index.html 在安裝過程中會自動檢測到沒有 gtk2.4 的開發環境 dev cpp 的主目錄中,如 d dev cp...

Gtkmm在dev cpp下的配置

gtkmm安裝 1.首先安裝dev cpp 2.然後安裝最新的gtkmm2.4來自 3.在命令列執行pkg config libs cflags gtkmm 2.4 pkg config.txt 這樣將生成一些編譯和連線需要的路徑引數,如下 這下面的內容放到編譯器選項中的 編譯時加入以下命令 mms...