c++ smart pointer 趣谈
?
上班的時候同事問起我一段項目中的舊代碼,大致如下
void foobar() {// some code herechar* buffer = new char[length];std::auto_ptr<char> useless(buffer);// more code using 'buffer' here }這段代碼這樣寫的目的是:
- buffer在超出scope(這里是函數foobar)時會自動釋放,防止內存泄露,因為在后面的代碼中有可能會提早返回或者拋出異常。
- 后面在使用buffer的時候可以當成普通指針一樣使用,避免了調用auto_ptr.get函數,只要不手動delete它
然后又給他講了一些C++其他智能指針的用法,在給他解釋的過程中,發現可以用一種有趣的方式來解釋,即比喻。
?
我們將智能指針比作一個個性格迥異的人,智能指針里面的原始指針比作藏寶圖,而原始指針指向的資源(內存,句柄,COM對象等等)比作寶藏。
?
scoped_ptr(from boost)
scoped_ptr是一個極度自私的人,自個獨享藏寶圖,不懂得怎么去分享或者傳給后人,自己死了之后就會把寶藏毀掉,不想落入他人之手。
?
unique_ptr
unique_ptr稍微好點,他在自己死之前會把藏寶圖傳給自己的繼承人,然后就這樣代代相傳。
?
auto_ptr
auto_ptr雖然看起來像是復印一份藏寶圖給繼承人,但是私底下干的卻是傳遞的勾當,即不復印,只傳遞,傳遞之后自己就沒有藏寶圖了。
?
shared_ptr
唯一懂得共享寶藏的人就數shared_ptr了,多個shared_ptr共享寶藏,沒有任何一個擁有絕對的所有權。而每一個shared_ptr都知道除了自己之外還有多少個shared_ptr共享這份寶藏。所以當一個shared_ptr死了之后,其他人都知道。那如果死的是共享寶藏的最后一個人,他才會把寶藏毀掉。
?
而在C++的世界中,需要各種性格的人,各有各的用處,哪怕是自私的人。所以像scoped_ptr這樣的人也還算受歡迎,大家有時候就喜歡他的這份自私的品質。
但是表里不一的人在C++是不受歡迎的。曾經還沒有unique_ptr的時候,大家還覺得auto_ptr很有用。自從unique_ptr誕生后,由于auto_ptr和unique_ptr都差不多,但是由于他說一套做一套,于是大家都建議不要去招惹他。
當然,我們不要忘了給好好先生shared_ptr發張好人卡。
?
暫時寫到這里吧,估計知道各種智能指針的人都不知道我在講些什么。
轉載于:https://www.cnblogs.com/jianqifeihong/p/3520042.html
總結
以上是生活随笔為你收集整理的c++ smart pointer 趣谈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水池数目---深搜思想
- 下一篇: form中onsubmit的使用