gxx base 二 智慧型指標

2021-08-07 12:09:52 字數 2830 閱讀 8775

gxx_base(二) 智慧型指標

為什麼要使用智慧型指標?

在很多時候,為了提高程式的執行速度,經常需要引用同一記憶體塊,可能多處都用到這一塊記憶體,但不知道什麼時候該釋放,因此引入智慧型指標,對記憶體進行引用計數管理。

當有引用時,引用計數自增,當引用結束時,引用計數自減, 引用計數變為0時,釋放指標指向的記憶體。

在 上一章中介紹了 gxxobject類, 它提供了 retain,release方法來增加引用計數和減小引用計數,直接用這個2個方法,會導致**很難維護,  容易用錯或者忘記呼叫它們,導致出現野指標或記憶體洩露問題。使用智慧型指標來維護引用計數,會讓這個工作變得很簡單。

眾所周知,區域性物件生命週期結束時,編譯器會自動呼叫區域性物件的析構函式,利用這個特性, 智慧型指標物件在構造時呼叫retain,在析構時呼叫release。

在下面這段**中檢視注釋,更能容易理解智慧型指標的工作原理

template<class_ty>

classgxxautoptr

gxxautoptr(constgxxautoptr<_ty>&_right)

else

}

template<class_other>

gxxautoptr(gxxautoptr<_other>&_right)

else

}

~gxxautoptr()

_ty&operator*()const

_ty*operator->()const

_ty*get()const

template<class_other>

operatorgxxautoptr<_other>()

operator_ty*()const

gxxautoptr<_ty>&operator=(_ty*_ptr)

gxxautoptr<_ty>&operator=(gxxautoptr<_ty>&_right)

private:

_ty*_myptr;

};下面舉例例項化這個智慧型指標模板類:

class a : public gxxobject

;typedef gxxautoptraptr;

void func(aptr tmpptr)

void main() 

aptr p1 = a::create();

p1->a = 10;

p1->b = 12;

printf("%d,%d\n", p1->a, p1->b); // 輸出 10,12

aptr p2 = p1;

printf("%d,%d\n", p2->a, p2->b); // 輸出 10,12

func(p2);

printf("%d,%d\n", p1->a, p1->b); // 輸出 100,120 }

智慧型指標(二)

智慧型指標存在的問題 通過對指標的封裝,讓類可以像指標一樣。這樣的智慧型指標還是存在些問題。之前我們解決了,物件拷貝問題,引入引用技術儲存拷貝次數,當拷貝次數為1時,便可以直接釋放析構物件。現在存在的新的問題是,之前都是用來管理單個物件,那麼如果想管理乙個陣列呢?因此出現了下面的問題 class a...

智慧型指標 二 scoped ptr

boost scoped ptr特點 boost scoped ptr的實現和std auto ptr非常類似,都是利用了乙個棧上的物件去管理乙個堆上的物件,從而使得堆上的物件隨著棧上的物件銷毀時自動刪除。不同的是,boost scoped ptr有著更嚴格的使用限制 不能拷貝。這就意味著 boos...

Rust 智慧型指標(二)

rc是引用計數指標,可以使用clone使得指標所指向的資料具有多個所有者。enum list use list use std rc rc fn main 需要注意的是,rc指標的資料是不可變的 refcell指標可以繞過編譯期借用檢查,普通指標和引用同一時間只能有乙個可變引用或者多個不可變引用。而...