C shared ptr使用時的幾個問題

2021-10-04 17:29:24 字數 1954 閱讀 1139

shared_ptr.是c++為了提高指標安全性而新增的智慧型指標,方便了記憶體管理。功能強大,但是也要注意以下問題:

int

* pintvalue =

newint

; shared_ptr<

int> shptr= pintvalue;

// 語法錯誤

shptr = pintvalue;

// 語法錯誤

int

* pintarr =

newint[10

];shared_ptr<

int>

sp1(pintarr )

;shared_ptr<

int>

sp2(pintarr )

;// 析構時兩次釋放同一記憶體

錯誤作法:

class

test;~

test()

;public

: shared_ptr

sget()

};test one;

shared_ptr two= one.

sget()

;// 兩次釋放t物件破壞堆疊

// 兩次釋放one物件破壞堆疊!!!!!

// 兩次釋放one物件破壞堆疊!!!!!

// 兩次釋放one物件破壞堆疊!!!!!

正確作法:

class

test

:public enable_shared_from_this;~

test()

;public

: shared_ptr

sget()

};test one;

shared_ptr two= one.

sget()

;// 正確了。

class

father

;class

son;

typedef shared_ptr father_ptr;

typedef shared_ptr son_ptr;

class

father

son_ptr m_son;};

class

son father_ptr m_father;};

father_ptr f

(new

father()

);son_ptr s

(new son)

; f-

>m_father= s;

s->m_son= f;

f的引用計數為2,s的計數也為2,退出時,shared_ptr所作操作就是簡單的將計數減1,如果為0則釋放,顯然,這個情況下,引用計數不為0,於是造成f和s所指向的記憶體得不到釋放,導致記憶體洩露。

class

test

~test()

// 更多的函式定義…};

void

thread_fun

(shared_ptr sp)

shared_ptr

sp1(

new test)

;thread t1

(bind

(&fun, sp1));

thread t2

(bind

(&fun, sp1));

t1.join()

;t2.

join()

;

由於多執行緒同時訪問智慧型指標,並將其賦值到其它同類智慧型指標時,可能發生兩個執行緒同時在操作引用計數,而導致計數失敗或無效等情況。

使用weak_ptr可以解決類多執行緒中的問題。

void

fun(weak_ptr wp)

else

}

wangEditor富文字使用時遇到的幾個問題

設定高度 1 在css中新增貼上一下 2 其實在wangeditor.js中改,也能達到效果,但是不到萬不得已不推薦這麼修改 3 新增上傳顯示 上傳發生錯誤 報錯 resolved org.springframework.web.httprequestmethodnotsupportedexcept...

c shared ptr使用的幾點注意

先介紹一下shared ptr.是c 為了提高指標安全性而新增的智慧型指標,方便了記憶體管理。功能非常強大,非常強大,非常強大 不單單是shared ptr,配合week ptr以及enable share from this 以及share from this 對於支援智慧型指標的c 版本程式設計...

C shared ptr的模擬實現

一 shared ptr的模擬實現 我在之前的部落格 智慧型指標 中有說過shared ptr的原理,那麼這篇部落格,我們模擬實現乙個shared ptr,讓大家能更好的理解它的原理。include 這個標頭檔案是用來使用互斥鎖 templateclass shared ptr 該函式是為了對引用計...