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 該函式是為了對引用計...