天天看點

MFC控件指針公用釋放方法[void* | 指針的引用]

前言

  看見重複的代碼就想封裝,這個習慣轉入c++之後也沒改,即使效率有所影響也盡力去封裝,比如在類的析構函數裡面釋放指針,一個個判斷然後一個個delete然後再設定為null,就想着寫一個公用釋放指針的方法,也就有了下面的問題一。

文章

正文

  一、問題函數

    本意:傳入一個指針,判斷指針是否為空,不為空的話就釋放掉,這樣在析構函數裡面不用一段段重複寫函數内的那段代碼,封裝後隻用寫如"freeobj(pbtnsave);"就可以了。

MFC控件指針公用釋放方法[void* | 指針的引用]

bool freeobj(void*  pobj)

{

    if(pobj)

    {

        delete pobj;

        pobj = null;

        return true;

    }

    return false;

}

MFC控件指針公用釋放方法[void* | 指針的引用]

    現實證明這種方法是行不通的,執行此方法後pbtnsave指針仍然不為空,然後想到了指針引用,能夠定義如下函數,但是使用起來很複雜(- - # 事實上不知道怎麼使用):

bool freeobj(void*  &pobj)

  二、折中辦法 

#define freeobj(pobj) if(pobj){delete pobj;pobj=null}

  隻是使用的話就不能帶分号了,因為這是一個宏,然後發現c++宏好強大,這樣寫效率也應該沒什麼好說的了,但是被同僚提醒,宏很強大但是切忌亂用。

  三、 一個指針的引用例子

MFC控件指針公用釋放方法[void* | 指針的引用]

void freeobj(int* &pobj)

    if(pobj){

//測試代碼

    int*   a; 

    int b = 1;

    a = new int;

    *a = b;

    freeobj(a);

MFC控件指針公用釋放方法[void* | 指針的引用]

    注意,如果測試代碼寫成如下則調用freeobj(a)會出錯:

    a = &b;

    目前對c++涉足尚淺,有朋友能解答一下的話非常感謝!

  四、摘錄c++ primer中關于”函數參數聲明成引用還是指針呢?“ ,也許有所啟示。

    引用必須被初始化為指向一個對象,一旦初始化了,它就不能再指向其他對象。指針可以指向一系列不同的對象也可以什麼都不指向。

結束語

  感覺還沒入門,等項目稍微緩點了還是系統的來惡補c++吧,通過這個例子對指針有了新的認識,目前的了解是函數傳遞指針隻是傳遞了一個位址而已,也就是拷貝了指向同一個位址的指針,而傳值是拷貝的一份資料,不同的是拷貝的指針能改變改位址的資料。

轉載:http://www.cnblogs.com/over140/archive/2010/04/18/1713595.html

繼續閱讀