c 智慧型指標

2021-07-30 15:59:38 字數 2585 閱讀 6249

c++智慧型指標**

智慧型指標是什麼?智慧型指標運用了一種思想->raii(資源分配即初始化)

資源分配及初始化:定義乙個類來封裝資源的分配和釋放,在建構函式初始化物件,析構函式釋放物件,可以正確的初始化和釋放。

為什麼出現智慧型指標,智慧型指標能夠有效地解決異常安全問題,或者資源未被釋放,而導致記憶體洩漏。例如:中斷語句導致**跳出,導致記憶體未被釋放。

常見的智慧型指標有哪些?auto_ptr,scoped_ptr,shared_ptr,weak_ptr;

c++發展在c++98標準時出現了auto_ptr(不完善的智慧型指標):即兩個指標無法共同管理一塊相同的空間(管理權的轉移);接著在c++發展的過程中出現了boost庫,boost庫中完善了auto_ptr所不完全的功能出現了scoped_ptr(防拷貝指標);shared_ptr(引用計數);weak_ptr(不計數,與shared_ptr結合使用);

auto_ptr:

template

class autoptr

autoptr(autoptr& ap)//拷貝構造

autoptr& operator=(autoptr& ap)//賦值操作符過載(管理權的轉移)

return *this;

}t& operator*()//過載*操作符

t* operator->()//過載->操作符

~autoptr()//析構函式

private:

t* _ptr;

};

由於auto_ptr無法實現多個指標共同管理一塊記憶體空間,因此被稱為失敗的作品;在boost庫中產生了scoped_ptr,c++11中稱為unique_ptr原理差不多是相同的,在保護中只宣告賦值操作符的過載函式,和拷貝建構函式;

scoped_ptr:

template

t>

class

scopedptr

t& operator*()

t* operator->()

~scopedptr

() ;

然而這兩種指標沒有解決多個指標共同管理一塊記憶體空間,接著shared_ptr採用引用計數的方法解決了這個問題,在shared_ptr中定義乙個整型的指標,多開闢一塊空間,存放引用計數,解決在析構時,析構多次的問題。

shared_ptr:

template

t>

class

sharedptr

sharedptr

(sharedptr

& ap)

sharedptr

& operator=(const

sharedptr

& ap)

else

}return *this;

}t& operator*()

t* operator->()

~sharedptr

()

else

;

shared_ptr很好的解決了多個指標管理一塊記憶體空間,然而出現了新的問題,迴圈引用的問題,這就要結合weak_ptr來使用,舉個例子:

struct listnode

};//假設用shared_ptr來管理鍊錶

int main()

/* 這就讓p1->next指向p2,p2的引用計數p2._c就會++,

同理p1的引用計數p1._c就會++;這樣會導致在析構時,無法析構,

從而導致記憶體洩漏。*/

解決辦法是什麼呢?weak_ptr很好的解決了這個辦法:

struct listnode

};template

class weak_ptr

~weak_ptr

private:

t* _ptr

}

解決了迴圈引用問題,還有個問題shared_ptr中採用的釋放方式時delete

若想開闢一塊陣列則採用delete,當然內建型別不用delete,也不會出錯,但是若是開闢string型別的陣列則會出現問題,這就要考慮到string的物件模型了,string會在開頭多開闢四個位元組用來存放個數,然而指標釋放則不會向前便宜四個位元組,因此又採用了仿函式,用來解決不是內建型別的釋放。

仿函式:即在類中過載operator()。

template

struct less

};int main()

上面是仿函式的乙個例子,仿函式就是乙個類中過載了operator(),可以像普通函式一樣使用。

智慧型指標總結

智慧型指標採用了raii的思想方法:在建構函式初始化物件,析構函式釋放資源。

智慧型指標過載了operator*和operator->,能夠像普通指標一樣使用。

四個智慧型指標:auto_ptr;scoped_ptr;shared_ptr;每個指標有各自的特點。注意:shared_ptr,採用了weak_ptr解決迴圈引用的問題,定製仿函式解決型別析構問題。

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...