Re: [問題] 如何用STL創造二維矩陣

看板C_and_CPP作者 (眠月)時間16年前 (2009/12/08 19:51), 編輯推噓13(13048)
留言61則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《NoobImage (老人家)》之銘言: : 相當需要補充STL方面知識 : 尤其以矩陣運算為迫切需要 : 此次問題主要是用來解決 : 我BCB動態配置用到爆了 (沒錯 真的爆了 配置太多 記憶體不足) : 約用了 160000*int 時 會爆掉 ...... : 聽說(一切都是聽說) STL可以解決配置過大的問題 嗯,這真的只是「聽說」而已, 我不知道你是聽誰說的,但是如果不是那個人講錯,就是你聽錯。 根本沒有這回事,所以不要浪費你的時間往這個方向了。 如果 BCB 的記憶體管理有問題, 那不管你手工打造還是用 STL,都一樣是跟 BCB 要記憶體,一樣會面對同樣的問題, 你如果用 Win32 API 跟 OS 直接拿那就是另外一回事, 不然這條路只是浪費時間 O_O 如果一個環境有問題,這是根本的問題,真正要做的是換一個環境。 如果已經換不開了,比方說你大概有好幾萬行程式碼是跟 BCB 咬死的, 那只能建議你試試看直接跟 OS 拿記憶體了…… -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.115.141 ※ 編輯: yoco315 來自: 118.160.115.141 (12/08 19:52)

12/08 20:08, , 1F
忘了有HeapMemory直接跟OS要memory的這一招....XD
12/08 20:08, 1F

12/08 20:26, , 2F
我只能說 當你使用BCB6碰到才懂 它的問題不是出在量
12/08 20:26, 2F

12/08 20:26, , 3F
也不是管理 而是最後面的free/delete產生的BUG
12/08 20:26, 3F

12/08 20:29, , 4F
樓上, 我覺得是是你沒看懂y大的回應, 如果它是BCB在new
12/08 20:29, 4F

12/08 20:29, , 5F
/delete的bug, 你用"new"的跟用STL, 因為底層都還是用
12/08 20:29, 5F

12/08 20:30, , 6F
BCB的memory management的LIB, 有bug存在都一樣可能會發
12/08 20:30, 6F

12/08 20:31, , 7F
生, 沒遇到是某些case STL沒有真正free掉mem, 所以運氣
12/08 20:31, 7F

12/08 20:31, , 8F
好沒遇到; 用久了用多了會不會出事, 只有天曉得....Orz
12/08 20:31, 8F

12/08 20:34, , 9F
問題可能出在delete 二維 而STL對Vector屬於一維
12/08 20:34, 9F

12/08 20:35, , 10F
當初解決的方式也是繞過二維delete而已 只是程式攏長
12/08 20:35, 10F

12/08 20:36, , 11F
且速度較慢 並不是所謂 記憶體管理問題 而是delete瑕疵
12/08 20:36, 11F

12/08 20:37, , 12F
不需要借OS mem 也毋須換開發軟體只要一個乾淨的del方法
12/08 20:37, 12F

12/08 20:37, , 13F
C/C++沒有真正的二維陣列, 多維也不過是一維串起來的@@"
12/08 20:37, 13F

12/08 20:38, , 14F
你懷疑二維有錯, 就要一個NxN大小的一維, 自己map成二維
12/08 20:38, 14F

12/08 20:39, , 15F
的來用試看看; 至於什麼換一個乾淨的del方法, 老實說看
12/08 20:39, 15F

12/08 20:39, , 16F
那有點離題了
12/08 20:39, 16F

12/08 20:39, , 17F
到小弟不知道有什麼叫"乾淨的del方法"可以用的....Orz
12/08 20:39, 17F

12/08 20:43, , 18F
我認為解決這難題比討論它原理更有價值 因為問題本身並
12/08 20:43, 18F

12/08 20:43, , 19F
不明確 只有try到正確 才能說明問題的根本
12/08 20:43, 19F

12/08 20:45, , 20F
而題目我所要表達的就是如此所以我只簡單說明發生的問提
12/08 20:45, 20F

12/08 20:54, , 21F
你看得懂`用HeapMalloc`這句話嗎... ?
12/08 20:54, 21F

12/08 20:55, , 22F
del到最底層也只是把那一塊mark並且歸還而已
12/08 20:55, 22F

12/08 21:48, , 23F
我認為, 你就是不懂原理也不像想了解原理, 才一直不懂我
12/08 21:48, 23F

12/08 21:49, , 24F
們在說什麼; 講白話一點, 如果你的懷疑-BCB的delete[]有
12/08 21:49, 24F

12/08 21:49, , 25F
bug是對正確的, 那麼你在BCB上用STL一樣不能解決問題,
12/08 21:49, 25F

12/08 21:49, , 26F
如果恰好解決, 那不是你本來的new/delete邏輯有誤, 就是
12/08 21:49, 26F

12/08 21:50, , 27F
運氣好, 用STL沒遇到那個delete的問題點, 因為STL也要動
12/08 21:50, 27F

12/08 21:50, , 28F
態配置, 它內部實作也一樣用new/delete, 這些都同樣會使
12/08 21:50, 28F

12/08 21:50, , 29F
用BCB的Memory Management, 再講白話一點要錯是大家一起
12/08 21:50, 29F

12/08 21:51, , 30F
錯, STL一時OK只是運氣好剛好沒碰到.
12/08 21:51, 30F

12/08 21:52, , 31F
如果BCB的delete - 即Memory Management有問題, 你要迴
12/08 21:52, 31F

12/08 21:52, , 32F
避的方法就是y大提供的HeapAlloc, 直接跟OS要, 自己來管
12/08 21:52, 32F

12/08 21:53, , 33F
理, 因為那樣才會繞過BCB自己的機制.
12/08 21:53, 33F

12/08 21:53, , 34F
反過來說, 同樣的code你試過其他IDE來build來run嗎??還
12/08 21:53, 34F

12/08 21:54, , 35F
是網路上有很人反應了類似的問題??不是說這些開發工具提
12/08 21:54, 35F

12/08 21:54, , 36F
供的東西就不會出錯, 只是delete這麼常用的東西有錯早就
12/08 21:54, 36F

12/08 21:55, , 37F
應該在各forum上被人報一堆了; Service Pack最後好像到4
12/08 21:55, 37F

12/08 21:56, , 38F
的樣子可以更新看看; 如果真的是BCB底層的delete機制有
12/08 21:56, 38F

12/08 21:56, , 39F
bug, 你只有選擇避開有問題的機制, 或者換掉BCB.
12/08 21:56, 39F

12/08 21:58, , 40F
最後還是要提那句老同事說過的一句話:
12/08 21:58, 40F

12/08 21:59, , 41F
"你永遠無法證明一個程式正確, 只能證明它有錯"
12/08 21:59, 41F

12/08 22:03, , 42F
Err~眠月大不好意思, 小弟推了一堆, 也許可以回文的Orz
12/08 22:03, 42F

12/08 22:08, , 43F
其實就我的經驗, 程式暫時能跑是大部份人的目標
12/08 22:08, 43F

12/08 22:09, , 44F
大約只有 10% 的人是希望程式能一直好好的跑下去
12/08 22:09, 44F

12/08 22:09, , 45F
原因就是因為, 讓程式能一直好好跑下去, 要探究的主題太多
12/08 22:09, 45F

12/08 22:10, , 46F
但通常這部份的知識, 才是一個好的程式設計師的價值所在
12/08 22:10, 46F

12/08 22:18, , 47F
我也還在用BCB6,從來沒發覺delete有問題 XD
12/08 22:18, 47F

12/08 22:41, , 48F
他很堅持 delete 有問題的話,我很想建議他不要 delete XD
12/08 22:41, 48F

12/08 22:44, , 49F
最近版上這樣的人太多了 ...唸也不好意思唸了
12/08 22:44, 49F

12/09 05:45, , 50F
V大真是熱血青年。
12/09 05:45, 50F

12/09 08:38, , 51F
唉~~因為自己的工作code看的不順利, 還趕時間要改完Q_Q~
12/09 08:38, 51F

12/09 09:14, , 52F
後來想到, 上面推了那一大段外, 還有一種可能是誤寫了超
12/09 09:14, 52F

12/09 09:15, , 53F
過要來的heap空間導致破壞了記錄heap資訊的欄位, 記得之
12/09 09:15, 53F

12/09 09:15, , 54F
前有討論heap資訊會放在要來的heap資料附近....@_@"
12/09 09:15, 54F

12/09 17:55, , 55F
結果出來了 不是Delete的問題 是真的檔案過大
12/09 17:55, 55F

12/09 17:55, , 56F
後來發現學妹用了2500000*INT 動態配制不足
12/09 17:55, 56F

12/09 17:56, , 57F
之前一直固執己見造成各位困擾在這表達歉意
12/09 17:56, 57F

12/09 17:57, , 58F
不過經過各位的解釋我也學到很多 謝謝
12/09 17:57, 58F

12/09 19:10, , 59F
噗嗤XD 剛算了一下, 那個大小才Hex 6位數, 應該去BCB6
12/09 19:10, 59F

12/09 19:11, , 60F
把Heap size調大就可以了, 預設的設定好像是0x00100000
12/09 19:11, 60F

12/09 19:11, , 61F
自己改最大好像能到0x01000000; 要更大BCB就不知道了:)
12/09 19:11, 61F
文章代碼(AID): #1B7ZtE1p (C_and_CPP)
文章代碼(AID): #1B7ZtE1p (C_and_CPP)