C_and_CPP 板


LINE

先回答你的問題 首先一個觀念, shared_ptr 跟 unique_ptr 的設計 就是你可以把這個變數「當成指向物件的指標變數來使用」 例如對 Foo* pFoo = new Foo(); 可以 pFoo->bar(); 那 shared_ptr<Foo> spFoo (new Foo()); 也就可以 spFoo->bar(); 不過上面那句「當成」有個但書是「你不能對它進行指標算術 (包含陣列存取)」 因為概念上這些東西是用來管理一個物件的, 對這物件之外的地方存取沒有意義 所以雖然可以 *spFoo 取得所管理的物件, 但不能寫 spFoo[0] 做陣列存取 ==== 那麼這裡就要回到你一開始的指標版本了 你在宣告了 std::vector<std::vector<int>> *p = ...; 之後 下面直接使用了 p[0] 去取得這個物件 (像是 p[0].size() 去取得外層長度, 或 p[0][0] 取得第一列等等) 雖然你取到了, 但這只是因為它是指標變數所以 *p 等同 p[0] 而已 這裡正確的取法是要使用 *p 去取得物件 (它又不指向一個陣列為什麼要 [0] ?) (也就是像上面那個要寫成 (*p).size() 和 (*p)[0] 才對) 這即是造成了你換成 shared_ptr 之後編譯不過的原因 不然理論上指標版本的程式碼跟 shared_ptr / unique_ptr 版本的程式碼 應該是無痛轉換的才對 ==== 然而 (這裡算是一部份的題外話) 使用動態配置產生一個 vector 物件是有點疊床架屋的 因為 vector 自己本身就是使用動態配置來配置它的陣列內容的 (也因此才能夠隨意增加長度) vector 的本體其實相對很小, 沒記錯應該等同數個 int 大小而已 傳來傳去的成本也並不高 這也就是為什麼推文一開始在問你「為什麼不直接宣告 vector 物件」的原因 ==== 再延伸出去一點 相對於 shared_ptr / unique_ptr 是對「(動態配置物件的)指標」的包裝 vector 則是對「(動態配置的)陣列」的包裝 也就是設計上 vector 才是使用陣列的存取方式 (也就是 [] 的方式) 這同時也呼應到版上常常看到很多人在講的「指標不等於陣列」這句話 對一般的指標來說, 雖然編譯到底層的機械碼是一樣的, 但上層的語意不同 而 shared_ptr / unique_ptr 跟 vector 即是分別抓取這兩種語意做為存取介面 因此在使用時不能混用這兩種存取介面 -- 有人喜歡邊玩遊戲上逼; 也有人喜歡邊聽歌打字。 但是,我有個請求, 選字的時候請專心好嗎? -- 改編自「古 火田 任三郎」之開場白 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.9.46
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1506618874.A.FFC.html
1F:→ PkmX: std::{shared,unique}_ptr之後可以用在T[]上 09/29 03:58
3F:→ LPH66: 關於這個, https://stackoverflow.com/a/16804634 這個回答 09/29 09:40
4F:→ LPH66: 比較了 std::vector, std::array 跟 std::unique_ptr<T[]> 09/29 09:41
5F:→ LPH66: 它們的各個方面, 三種各擅勝場在有相對的需求時確實好用 09/29 09:42
6F:→ LPH66: 所以我這篇文章比較沒有著重在哪個狀況要用哪個 09/29 09:43
7F:→ LPH66: 而是在解釋它們的設計概念跟語意 09/29 09:44
8F:→ LPH66: 再說我也沒有完全否定 shared_ptr<vector<T>> 就是 09/29 09:45







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP