作者hsm926 (雜魚護法#1)
看板C_and_CPP
標題[問題] Obj-C 記憶體汙染問題
時間Sun Oct 2 15:01:15 2016
開發平台(Platform): MAC OS X 10.11.6 Xcode
額外使用到的函數庫(Library Used): LibUSB (很舊的版本)
問題(Question):
有兩隻.m程式,這邊用A檔與B檔代稱.
A檔使用一個global structure陣列
--而且不指定大小(結構還有結構&union)--
B檔使用一個global structure指標
--當作USB device handler(結構裡面還有結構&指標)--
這兩隻檔案做的事情完全沒關係,
但是A檔處理某些特定複雜的物件後(比較簡單的不會),
會把B檔Handler裡面的結構或是指標記憶體蓋掉或者釋放?
導致之後存取Handler發生crash.
只要是會發生的物件,每次必定在固定位置發生crash.
(e.g. A檔需要一個迴圈執行100次,才能完成處理物件.
處理相同物件,必在第n次發生)
問題1: 直接在m檔 @implementation和 @interface
外面宣告這種結構,算是純c的寫法嗎?
問題2: 應該如何解釋這種記憶體被汙染現象?
目前我有發現三種暫時解決的方式
a) 把handler改成static or
b) 把handler放到class裡面 or
c) 把A檔陣列指定固定大小(因為需要的大小是已知的)
補個問題3: 有沒有推薦的正確解法?
因為我是Obj-C新手,有任何錯誤提問或觀念請見諒
另外,前任開發者已經不可考,所以也無從得知為何要這樣寫.
歡迎任何大大給予指教
感激不盡!!!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.184.42.52
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1475391677.A.AD4.html
※ 編輯: hsm926 (111.184.42.52), 10/02/2016 15:45:40
※ 編輯: hsm926 (111.184.42.52), 10/02/2016 15:46:56
→ Sirctal: 這是C跟C++版吧... 10/02 16:28
推 wtchen: 板規有寫,可討論Obj-C (雖然不是現任板工定的) 10/02 16:32
→ uranusjr: 這問題感覺和 Objective-C 完全無關, 但我看不懂描述... 10/02 18:45
→ uranusjr: 為什麼不實際放幾段程式, 而是落落長寫一堆呢 10/02 18:46
→ wtchen: 板工完全沒碰Obj-C.... @@ 10/02 20:23
→ wtchen: 這板規我也不知道是啥時引進obj-C的.... 10/02 20:27
推 firejox: 因為沒obj c版吧@@ 10/02 21:26
推 fatrabitree: Macdev版可以討論,但我不建議限縮討論空間就是 10/02 21:51
→ hsm926: 我有先看板規,因為Obj-C聽說可以和C混著寫,所以我問題1 10/02 22:07
→ hsm926: 是在問是不是C的寫法,也算是有點相關吧.. 10/02 22:07
→ hsm926: 實際程式很亂&複雜,不好意思放上來,我再想其他辦法好了 10/02 22:09
→ Killercat: lldb看出問題的.m有沒有currupt啊.... 10/02 22:24
→ Killercat: 先看debug mode能不能重現 不能重現就很麻煩了 10/02 22:25
→ hsm926: 特定物件,每次都能重現,且在固定位置. 10/02 22:31
→ hsm926: A檔就是把它結構陣列裡面變數填值, B就LibUSB沒在做什麼事 10/02 22:32
→ hsm926: 等A檔填值的動作做很多次, B指標裡面記憶體就被蓋到了.. 10/02 22:34
→ hsm926: 我研究一下lldb好了,感謝K大與以上大大 10/02 23:19
推 ho83leo: xcode version 8.0 ? 10/03 23:34
→ hsm926: Xcode 7.0 10/04 00:35