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