看板 C_and_CPP 關於我們 聯絡資訊
雖然技術上可行,但建議原 Po 除了非常需要計較速度的狀況下,不要這樣自己建立 陣列。個人不擅長吵架,所以召喚 C++ FAQ Lite 和 C++ 發明人來當擋箭牌好了 xDD 然權威的話也不一定是對的,但好像就比較多人相信... 這個連結回答了原 Po 的問題: C++ FAQ Lite [16.16] How do I allocate multidimensional arrays using new? http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.16 但真正的答案其實是這兩個==> 自己包 array C++ FAQ Lite [16.17] But the previous FAQ's code is SOOOO tricky and error prone! Isn't there a simpler way? http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.17 ==> 用 vector C++ FAQ Lite [16.19] What's another way to build a Matrix template? http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.19 這篇解釋為什麼平常不要用 array: C++ FAQ Lite [34.1] Why should I use container classes rather than simple arrays? http://www.parashift.com/c++-faq-lite/containers.html#faq-34.1 Bjarne Stroustrup (C++ 發明人) 說過,除非必要,否則不要自己寫 new 或是讓介 面中有 array: Why does C++ allow unsafe code? http://www2.research.att.com/~bs/bs_faq.html#unsafe 召喚完畢! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.39
johnhmj:但…問題是,new/delete是很常用的關鍵字呀! (._.?) 06/26 21:30
你當然可以用 new,但沒事不要 new 一個陣列到處丟。我相信大部分的狀況都不用 自己花那麼多心力管理記憶體...。另外就是大家都在用的東西不見得是好東西啊 xDDD
loveme00835:用新版的allocator吧, 我覺得多數人不用malloc/free 06/26 21:51
loveme00835:的原因是不用sizeof算引數值, 但是隱含呼叫建構子的語 06/26 21:53
loveme00835:意這點都被忽略, 所以整份碼就算記憶體管理得好, 也是 06/26 21:54
loveme00835:讀起來有夠噁心 06/26 21:55
確實 allocator 不會呼叫建構子(你說的新版是指 C++0x 嗎?),但為什麼要讓 記憶體維持在一個沒有初始化的狀態呢?回到主題,反對自己沒事 new 一個 array 的 理由,同樣的也適用於 allocator...
angleevil:看了一下primer發現,allocator好像malloc喔.我還是愛new 06/26 22:13
概念上沒錯,雖然他們有些小小的細節差異 xD 另外 new 也不保證會幫你作初始化, 在某些狀況下(如原 Po 的 int 陣列)要加上 initializer. 我相信 C++ Primer 有講, 就不贅言了... ※ 編輯: Favonia 來自: 140.112.30.39 (06/26 22:45)
loveme00835:我指的新版是scoped_allocator,其連記憶體來源都可以 06/26 23:14
loveme00835:遞迴指定, 不去呼叫建構子不代表它沒有初始化過, 因為 06/26 23:16
loveme00835:多個物件可以活在重疊的空間裡, new要玩就玩多個版本 06/26 23:17
loveme00835:不是只用一種的半調子, 它的用途根本不在這 06/26 23:18
(版主要求合併,避免整個版都被我的文章淹沒 xD) 補充一些資訊給不知道 scoped_allocator 的人好了。考慮這樣的狀況: vector<string> 以往 C++03 只能(方便的)要求 vector 要用某個 allocator, 但每個 string 卻可能使用預設 allocator. C++0x 目前企圖引入一些新的方法,讓 你也可以控制裡面 string 的 allocator, 甚至更多層。可以參考這個 PDF: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2554.pdf (尤其第三四五頁的圖很可愛又很清楚。) === 我想你的意思是說使用 allocator 可以看清楚「要記憶體」和「初始 化」這兩步。但我個人的立場是,這樣的區分只會帶給程式設計師額外的精 神負擔,所以我問為什麼要區分開來。我猜測你的意思是說區分開來就可以 實作記憶體共用或其他精彩的技巧。雖然技術上可以硬幹,但我個人反對用 allocator 來實作記憶體分享(也就是 flyweight pattern),因為實作記 憶體分享可以用高階、獨立於 allocator 的方法實作,不需要碰底層。 就精神上來說,allocator 代表一個低階的記憶體管理介面,然後 scoped_allocator(精神上)還是一個低階的記憶體管理介面。這介面(精 神上)並沒有考慮共用。技術上來說,為了要共用,你得要判斷兩個物件 是不是可以用一個物件代替,可是 allocator 的介面只能傳大小。根本沒 辦法從大小判斷是不是同一個物件,所以得要自己另外定介面硬幹。我個人 認為,在一般的狀況下使用「高階的記憶體分享寫法」配合預設的 allocator 就足夠用了,並不需要把整套丟到 allocator 裡自己實作。總之不好意思 我還是沒有被說服分開兩階段有什麼好處。 澄清一下,當需要嚴格控制記憶體時,當然要用 allocator. 我的意思 是說「平常」沒事不要也不用管低階的事情,因為很容易出錯又沒有太大好 處。 === // 以下部份複製自原文。誤解版主意思很抱歉。 不精確的說,new 的意義,就是建立一個物件,而一個物件,就是記憶體 上一塊區域,如此而已。(C++ 的語意很難精確定義... orz)new 當然有很 多版本,例如某個版本會在記憶體不夠時傳回空指標,某個版本可以直接拿現 有的指標來玩等等。包括 new[], C++03 至少有六種。不過不管是哪一種,重 點是沒事不要自己 new 一個陣列。我想這句話跟到底用哪個版本一點關係也沒 有,而 allocator 也避不開同樣的問題。 // 以下是原文的推文 → loveme00835:我對你的看法很有意見, 我是針對你不同問題回, 你好像 06/27 07:56 → loveme00835:以為我把他們搞在一起, 我推薦allocator的原因是其具 06/27 07:57 → loveme00835:函式帶來的細緻操作可讓每個步驟變得更清楚. 還有既然 06/27 07:59 → loveme00835:你說物件就只是記憶體而已, 那為什麼還特別強調用高階 06/27 08:01 → loveme00835:方法取代低階操作? 06/27 08:04 → loveme00835:要說精神, 去 comp.lang.c++/comp.std.c++ 看比較準喔 06/27 08:17 (為了反應推文所以 allocator 重寫。以下簡短回應原推文。) 物件是一塊記憶體,但不是佔記憶體都是物件。標準用一整大段來講物件 是什麼東西(我不要再貼標準了 orz 詳情請看 C++03 1.8 [intro] )。總之 new 的意義大致上是建立物件。 至於強調高階方法的原因我重寫時已經加上去了。見上文。 關於精神層面,我都盡量引用標準委員會公佈的語言標準和討論的文件。 當然那兩個群組應該不錯,不過我相信我引用的文件也不會輸。
firejox:我還是去擁抱malloc好了...另外假如要一份乾淨的mem可以 06/27 00:20
firejox:用calloc... 06/27 00:20
對於 C 或許可以,對於 C++ 有點危險。(我是假設這篇主題是 C++ 啦!) 至少有以下問題: (1) 都是 0 不一定是物件良好的初始狀態。 (2) 要 malloc/free 配合用。個人覺得 new/new[] 分兩種已經夠麻煩了。 不過你所要應付的狀況真的非常在乎速度和空間嗎?預設的 allocator 如果夠用就不用自己把手弄髒。把工作丟給那些函式庫吧。
angleevil:~"~如果版主指c++0x的allocator,恩,我可能要一段時間 06/27 08:44
angleevil:才會研究,我現在主打c. 06/27 08:45
angleevil:~"~c++真是怪物,好多都沒碰過. 06/27 08:47
※ 編輯: Favonia 來自: 140.112.30.39 (06/27 13:40)
firejox:這種跟弄髒手無關,而是對於寫的code的掌握度.. 06/27 20:22
firejox:malloc/free 他只是簡單易用而已... 06/27 20:23
firejox:任何物件都有他的初始化 這是寫code要設定的部份 06/27 20:31
喔喔,了解 @@ ※ 編輯: Favonia 來自: 140.112.30.39 (06/28 06:48)