看板 C_and_CPP 關於我們 聯絡資訊
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
Caesar08: 1. 例如你的object不需被動態創造出來(所以不會用smart 04/27 10:10
Caesar08: pointer),又需要被別的object操作時,但又需要放在co 04/27 10:10
Caesar08: ntainer時 04/27 10:10
哦哦原來如此!! 因為reference不是object 所以想放在container內,又不想佔據太多記憶體的話 這時候就會使用到built-in pointer了! 了解!!: )
Caesar08: 2. 當你需要動態創造object,又想要把他當成一般object 04/27 10:11
Caesar08: 使用時(所以不需自己delete) 04/27 10:11
Frozenmouse: unique ptr 就我之前看是為了保證只有一個地方有該指 04/27 10:14
Frozenmouse: 標的生殺大權 04/27 10:14
對啊,就是這個應用的點不知道多不多 所以才想問看看她會不會常使用到
Caesar08: 3. 看不懂。4. 沒問題 04/27 10:14
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
Caesar08: 你的a與b是不同意思,不能拿來比較。 04/27 10:30
Caesar08: 還有,動態陣列用vector就好,沒必要用shared_ptr 04/27 10:30
啊!!! 好有道理啊!!! 看來是我誤會書中的意思了 一般使用動態陣列 應該如同Caesar08板友說的使用vector 而不是要我使用shared_ptr指向一個vector! 而shared_ptr指向一個vector, 應該是應用在,多個object要共享同樣的資料的時候 希望我的理解沒有錯> <! 謝謝各位板友!!!: ) ※ 編輯: flere (1.168.143.106), 04/27/2016 10:51:35
Caesar08: shared_ptr主要是拿來解決共用的問題,而不是記憶體浪費 04/27 10:55
Caesar08: ... 04/27 10:55
好的> < 我把上面那一行砍掉以免誤導別人XD 共用才是最重要的目的 記憶體使用量變少只是剛好出現的一個現象,不應該被我當成使用shared_ptr的目的! 真的太謝謝你了!!! 讓我多瞭解了很多!!! ※ 編輯: flere (1.168.143.106), 04/27/2016 11:10:14
Frozenmouse: http://goo.gl/dQlwSl 底下的 Notes 部份,一時想不 04/27 10:58
Frozenmouse: 太到例子(′・ω・`) 04/27 10:58
Frozenmouse: 不過大致上就是像前面說的,不用自己delete,它會直 04/27 11:01
Frozenmouse: 接跟那個unique_ptr的生命週期 04/27 11:01
Frozenmouse: 有個應用例是丟例外的時候,純指標還要另外想辦法手 04/27 11:12
Frozenmouse: 動釋放,而用unique_ptr則不用擔心這點 04/27 11:12
有道理,這個書裡面也有提到 不過我剛剛嘗試了一下,shared_ptr也可以做到這一點XD 所以這應該不是unique_ptr的專利 感覺應該就像Caesar08還有你說的一樣 就是想當個一般的物件使用,又不想自己delete這樣~ 謝謝你~~~ ※ 編輯: flere (1.168.143.106), 04/27/2016 11:21:37
Jockey66666: 當你不需要copy的時候都用unique_ptr 04/27 14:12
CoNsTaR: 如果你真的很想把 Ref 裝進 STL 容器可以用 std::referen 04/27 17:17
CoNsTaR: ce_wrapper 04/27 17:17
CoNsTaR: 不過我也還沒去研究過 reference_wrapper 的實作 還不知 04/27 17:18
CoNsTaR: 道用指標和 reference_wrapper 的優缺點 04/27 17:18
CoNsTaR: 剛剛看了一下,std::reference_wrapper 內部也是直接儲存 04/27 17:28
CoNsTaR: 指標 04/27 17:28
firose: unique_ptr 很輕 就像一個 native ptr 一樣 04/27 17:28
Frozenmouse: 的確,不需copy的話unique_ptr的語義應該比較適合 04/27 18:35
Frozenmouse: shard_ptr就是要拿來分享啊,不然要幹嘛(? 04/27 18:36
Frozenmouse: *shared 04/27 18:36
Caesar08: 拿來做atomic operation... 04/27 21:24
Littlechozy: 做pimpl的時候要用unique_ptr 04/27 22:10
Littlechozy: 可參考http://stackoverflow.com/questions/5576922 04/27 22:11
legendmtg: unique_ptr 最常用的場合就pimpl idiom 04/27 22:12
flere: 還沒碰過這個> <我會好好記起來的!! 04/28 06:12
flere: 真的是謝謝大家: ))) 04/28 06:12