C 智慧型指標

2021-09-26 06:31:00 字數 3213 閱讀 5357

raii

raii(resource acquisition is initaliation) 是一種利用物件生命週期來控制程式資源( 記憶體,檔案控制代碼,網路連線, 互斥量等) 的技術

在物件構造時獲取資源,接著控制對資源的訪問使之在物件的生命週期內始終保持有效,最後在物件析構的時候釋放資源.實際上是把管理資源的任務給給乙個物件,此時就可以:

智慧型指標的原理

//在模板類中過載*,->.使smartptr可以實現指標一樣的使用

template

<

class

t>

class

smartptr

~smartptr()

t&operator*(

) t*

operator

->()

private

: t* _ptr;};

struct date

;int

main()

std::auto_ptr :

//c++庫中智慧型指標都定義在memory中

#include

class

date

~date()

int _year;

int _month;

int _day;

}int main (

)//因為上述問題,一般情況下不使用auto_ptr

unique_ptr :

int main (

)

簡化模擬實現unique_ptr

tmplete <

class

t>

class

uniqueptr

~uniqueptr()

t&operator*(

) t&

operator

->()

private

://c++11防拷貝: delete

uniqueptr

(uniqueptr

const&)

= delte;

uniqueptr &

operator

=(uniqueptr

const&)

=delete

//c++98防拷貝方式:只宣告不實現 + 宣告成私有

uniqueptr

(uniqueptr

const&)

; uniqueptr &

operator

=(uniqueptr cosnt &

)private

: t * _ptr;

}

std::shared_ptr :

int main (

)//結果為2

shared_ptr的原理: 通過引用計數的方式來實現多個shared_ptr物件之間共享資源shared_ptr在內部,給每隔資源都維護著乙份計數,用來記錄該份資源被幾個物件共享在物件被銷毀時(呼叫析構函式時),說明不在使用該資源,物件的引用-1

如果引用計數是0,就說明自己是最後乙個使用該資源的物件,必須釋放該資源

如果不是0,說明還有其他物件使用該資源,不能釋放,否則其他物件稱為野指標.

//實現簡單shared_ptr

#pragma once

#include

#include

using std::mutex;

template

<

class

t>

class

sharedptr

~sharedptr()

sharedptr

(const sharedptr

& sp)

:_ptr

(sp._ptr)

,_prefcount

(sp._prefcount)

,_pmutex

(sp._pmutex)

void

addrefconut()

//sp1 = sp2

sharedptr

&operator=(

const sharedptr

& sp)

return

*this;}

t&operator*(

) t*

operator

->()

intusecount()

t*get()

private

:void

release()

_pmutex-

>

unlock()

;if(deleteflag ==

true)}

private

: mutex *_pmutex;

//互斥鎖

int*_prefcount;

//引用計數

t* _ptr;

//指向管理資源的指標};

std::shared_ptr的執行緒安全智慧型指標物件中引用計數是多個智慧型指標共享的,兩個執行緒是智慧型指標的引用計數同時++或–, 這個操作不是原子的,引用計數原來是1, ++ 了兩次,可能還是2. 此時引用計數錯亂,會導致資源未釋放或者程式崩潰,所以智慧型指標中引用計數++,–是需要加鎖的,即引用計數的操作是執行緒安全的

智慧型指標管理的物件存放在堆上,兩個執行緒同時去訪問,可能會導致執行緒安全問題.

std::shared_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 智慧型指標

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