[問題] smart pointer的一些疑問

看板C_and_CPP作者 (人間失格)時間8年前 (2016/04/27 10:03), 8年前編輯推噓8(8027)
留言35則, 8人參與, 最新討論串1/1
hi~ 最近學了C++的smart pointer 學習內容為: C++ primer 5th, chapter 12 版上的一部影片以及一些文章 有些疑問想跟大家請教與討論! (與C++交往不夠深,有蠢問題的話請見諒> <) 1. 既然我們有smart pointer可以用 那還會有什麼情況 是"一定必須"要使用built-in pointer的呢? 我指的是一般應用程式開發,而不是到語言很底層的地方 因為我想smart pointer這個物件裡應該也是使用built-in poiner對吧? 以現代C++使用者的角度來看 是否應盡量避免使用built-in pointer? 2. 對於unique_ptr的使用時機超級不了解!! 這到底應該什麼時候使用呀?? 3. chapter 12.2是在講dynamic array 有提到說,我們應該盡量使用library container 盡量不要dynamic allocate array 但他是說"大部份的應用" 有什麼情況是使用dynamic allocate array會比較好的嗎? 4. 使用shared_ptr來產生2維陣列的方式 我底下這樣做可以順利執行 但我不確定是不是 好/正確 的方法 比如說我要產生一個3*4的2維陣列: auto p = make_shared<vector<vector<int>>>(); p->resize(3); for(auto &x : *p) x.resize(4); 問題很多> < 謝謝大家!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.168.143.106 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1461722636.A.8AC.html

04/27 10:10, , 1F
1. 例如你的object不需被動態創造出來(所以不會用smart
04/27 10:10, 1F

04/27 10:10, , 2F
pointer),又需要被別的object操作時,但又需要放在co
04/27 10:10, 2F

04/27 10:10, , 3F
ntainer時
04/27 10:10, 3F
哦哦原來如此!! 因為reference不是object 所以想放在container內,又不想佔據太多記憶體的話 這時候就會使用到built-in pointer了! 了解!!: )

04/27 10:11, , 4F
2. 當你需要動態創造object,又想要把他當成一般object
04/27 10:11, 4F

04/27 10:11, , 5F
使用時(所以不需自己delete)
04/27 10:11, 5F

04/27 10:14, , 6F
unique ptr 就我之前看是為了保證只有一個地方有該指
04/27 10:14, 6F

04/27 10:14, , 7F
標的生殺大權
04/27 10:14, 7F
對啊,就是這個應用的點不知道多不多 所以才想問看看她會不會常使用到

04/27 10:14, , 8F
3. 看不懂。4. 沒問題
04/27 10:14, 8F
3的問題就是說,比如說我們現在要一個pointer指向一個動態宣告出來的陣列 是使用: (a): int *a = new int[13]; (b): shared_ptr<vector<int>> a = make_shared<vector<int>>(13); 哪個比較符合modern c++ style這樣~ ※ 編輯: flere (1.168.143.106), 04/27/2016 10:23:45

04/27 10:30, , 9F
你的a與b是不同意思,不能拿來比較。
04/27 10:30, 9F

04/27 10:30, , 10F
還有,動態陣列用vector就好,沒必要用shared_ptr
04/27 10:30, 10F
啊!!! 好有道理啊!!! 看來是我誤會書中的意思了 一般使用動態陣列 應該如同Caesar08板友說的使用vector 而不是要我使用shared_ptr指向一個vector! 而shared_ptr指向一個vector, 應該是應用在,多個object要共享同樣的資料的時候 希望我的理解沒有錯> <! 謝謝各位板友!!!: ) ※ 編輯: flere (1.168.143.106), 04/27/2016 10:51:35

04/27 10:55, , 11F
shared_ptr主要是拿來解決共用的問題,而不是記憶體浪費
04/27 10:55, 11F

04/27 10:55, , 12F
...
04/27 10:55, 12F
好的> < 我把上面那一行砍掉以免誤導別人XD 共用才是最重要的目的 記憶體使用量變少只是剛好出現的一個現象,不應該被我當成使用shared_ptr的目的! 真的太謝謝你了!!! 讓我多瞭解了很多!!! ※ 編輯: flere (1.168.143.106), 04/27/2016 11:10:14

04/27 10:58, , 13F
http://goo.gl/dQlwSl 底下的 Notes 部份,一時想不
04/27 10:58, 13F

04/27 10:58, , 14F
太到例子(′・ω・`)
04/27 10:58, 14F

04/27 11:01, , 15F
不過大致上就是像前面說的,不用自己delete,它會直
04/27 11:01, 15F

04/27 11:01, , 16F
接跟那個unique_ptr的生命週期
04/27 11:01, 16F

04/27 11:12, , 17F
有個應用例是丟例外的時候,純指標還要另外想辦法手
04/27 11:12, 17F

04/27 11:12, , 18F
動釋放,而用unique_ptr則不用擔心這點
04/27 11:12, 18F
有道理,這個書裡面也有提到 不過我剛剛嘗試了一下,shared_ptr也可以做到這一點XD 所以這應該不是unique_ptr的專利 感覺應該就像Caesar08還有你說的一樣 就是想當個一般的物件使用,又不想自己delete這樣~ 謝謝你~~~ ※ 編輯: flere (1.168.143.106), 04/27/2016 11:21:37

04/27 14:12, , 19F
當你不需要copy的時候都用unique_ptr
04/27 14:12, 19F

04/27 17:17, , 20F
如果你真的很想把 Ref 裝進 STL 容器可以用 std::referen
04/27 17:17, 20F

04/27 17:17, , 21F
ce_wrapper
04/27 17:17, 21F

04/27 17:18, , 22F
不過我也還沒去研究過 reference_wrapper 的實作 還不知
04/27 17:18, 22F

04/27 17:18, , 23F
道用指標和 reference_wrapper 的優缺點
04/27 17:18, 23F

04/27 17:28, , 24F
剛剛看了一下,std::reference_wrapper 內部也是直接儲存
04/27 17:28, 24F

04/27 17:28, , 25F
指標
04/27 17:28, 25F

04/27 17:28, , 26F
unique_ptr 很輕 就像一個 native ptr 一樣
04/27 17:28, 26F

04/27 18:35, , 27F
的確,不需copy的話unique_ptr的語義應該比較適合
04/27 18:35, 27F

04/27 18:36, , 28F
shard_ptr就是要拿來分享啊,不然要幹嘛(?
04/27 18:36, 28F

04/27 18:36, , 29F
*shared
04/27 18:36, 29F

04/27 21:24, , 30F
拿來做atomic operation...
04/27 21:24, 30F

04/27 22:10, , 31F
做pimpl的時候要用unique_ptr
04/27 22:10, 31F

04/27 22:11, , 32F

04/27 22:12, , 33F
unique_ptr 最常用的場合就pimpl idiom
04/27 22:12, 33F

04/28 06:12, , 34F
還沒碰過這個> <我會好好記起來的!!
04/28 06:12, 34F

04/28 06:12, , 35F
真的是謝謝大家: )))
04/28 06:12, 35F
文章代碼(AID): #1N81uCYi (C_and_CPP)