智慧型指標分析

2021-08-11 07:47:54 字數 3584 閱讀 3928

在我們寫**時,經常會忘記釋放掉動態開闢出來的記憶體,或者在我們的程式中,new和delete中間有如 throw/goto/return/break 這樣引起執行流改變的語句時,就會造成沒有釋放資源,造成記憶體洩漏。

void test1()

t* operator-> ()

注意函式返回值型別

上面說了智慧型指標是什麼,以及為什麼存在這種智慧型指標,那麼下面我們再來看看智慧型指標都有那些代表,以及它的發展

早期c++98

auto_ptr

管理權轉移,帶有缺陷

boostscoped_ptr守衛指標防拷貝

scoped_arrary

shared_ptr共享指標引用計數,缺陷迴圈引用

shared_array

weak_ptr弱指標不單獨存在,輔助解決shared_ptr的迴圈引用問題

一、模擬實現autoptr指標

// 智慧型指標--類(autoptr指標)

//首先是個類

template

class autoptr

~autoptr()//析構,清理資源

}// ap2(ap1)

autoptr(autoptr& ap)

:_ptr(ap._ptr)

// ap1 = ap2

autoptr& operator=(autoptr& ap)

return *this;

}// 運算子的過載

t& operator*()

t* operator->()

private:

t* _ptr;

};struct aa

;//寫個函式對比測試一下

void func ()

void testautoptr()

分析:

與普通指標的異同

對比普通指標和智慧型指標,智慧型指標可以實現*/->兩個功能,同時可以自動清理資源

管理權的轉移

我們可以看到這裡就體現出了auto_ptr這種智慧型指標的特點,也是它的缺陷,當另乙個指標指向時,之前的指標就對它沒有任何權利了,變為空指標,權利全部給新的指標,乙個auto_ptr,只能管理一塊空間(就像乙個人只能有乙個男朋友/女朋友,分手後,前女友就和你沒有關係了,珍惜現女友)

二、模擬實現scoped_ptr指標

這個指標的特點是防拷貝

如何實現防拷貝

1.只宣告不實現

2.私有

templateclass scopedptr 

~scopedptr()

// 像指標一樣

t& operator*()

t* operator->()

// 防拷貝

// 1.只宣告不實現

// 2.私有

private:

scopedptr(const scopedptr& sp);

scopedptr& operator=(const scopedtr& sp);

//將拷貝構造和operator=封在類裡,設為私有

private:

t* _ptr;

};void testscopedptr()

(這兩個指標要結合起來使用)

auto_ptr能共享空間,scoped_ptr不能拷貝,都很bug,但我們還有shared_ptr(當然它也有迴圈引用的問題,所以有弱指標輔助)

templatet>

class sharedptr

~sharedptr()

}// sp2(sp1)

sharedptr(const sharedptr& sp)

:_ptr(sp._ptr)

,_refcount(sp._refcount)

// sp2 = sp1

sharedptr& operator=(const sharedptr& sp)

_ptr = sp._ptr;

_refcount = sp._refcount;

(*_refcount)++;

}return *this;

}t& operator*()

t* operator->()

int usecount()

private:

t* _ptr;

int* _refcount;

};

上面的程式只是shared_ptr的部分功能的思想體現,不是真正的模擬shared_ptr指標,真正的shared_ptr在boost庫里是很複雜的。

下面我們來說剛才寫道的迴圈引用問題

這裡的迴圈引用問題出現在了哪呢?

當我們調析構函式釋放空間時,就出問題了

當我們要是放cur時,如果把cur直接釋放,那麼next的_prev就成了野指標。同理next節點也是一樣的。 (其實就是當要釋放cur節點時,先要清理掉它內部的指標,可是cur->next指向next,next->prev又指向cur,所以他們就成了乙個死迴圈,一直就無法釋放)

所以迴圈引用就是兩個物件相互牽制了對方,從而導致兩個物件誰都無法被釋放,引發了記憶體洩露

所以為了解決這種問題,我們就要用weak_ptr我們只需要將節點的_next和_prev計數就好,不需要把shared_ptr的指標也計數,就可以解決問題

templateclass weakptr

weakptr(const sharedptr& sp)

:_ptr(sp._ptr)

{}weakptr& operator=(const sharedptr& sp)

t& operator*()

t* operator->()

private:

t* _ptr;

};

37 智慧型指標的分析

1 永恆的話題 這個程式的問題在於在 的27行,每for迴圈一次,就new乙個物件,但是只用乙個指標去指向這個物件,沒釋放記憶體,但是指標馬上又指向了另一段記憶體,這就造成了記憶體洩漏。2 深度的思考 3 智慧型指標分析 使用物件代替指標 從結果我們可以發現,指標指向的記憶體被釋放了,不會造成記憶體...

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...

基礎備忘 智慧型指標小分析

閱讀目錄 正文 回到頂部 所謂資源就是,一旦用了它,將來必須還給系統。c 中記憶體資源的動態分配經由new與delete實現。問題在於,無論是有意無意,我們有時候總會忘記釋放記憶體中的資源。例如delete語句出現在某個迴圈語句中,而我們的continue或者break卻跳過了它的執行 或者是在程式...