作者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://webptt.com/m.aspx?n=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
1F:→ Sirctal: 這是C跟C++版吧... 10/02 16:28
2F:推 wtchen: 板規有寫,可討論Obj-C (雖然不是現任板工定的) 10/02 16:32
3F:→ uranusjr: 這問題感覺和 Objective-C 完全無關, 但我看不懂描述... 10/02 18:45
4F:→ uranusjr: 為什麼不實際放幾段程式, 而是落落長寫一堆呢 10/02 18:46
5F:→ wtchen: 板工完全沒碰Obj-C.... @@ 10/02 20:23
6F:→ wtchen: 這板規我也不知道是啥時引進obj-C的.... 10/02 20:27
7F:推 firejox: 因為沒obj c版吧@@ 10/02 21:26
8F:推 fatrabitree: Macdev版可以討論,但我不建議限縮討論空間就是 10/02 21:51
9F:→ hsm926: 我有先看板規,因為Obj-C聽說可以和C混著寫,所以我問題1 10/02 22:07
10F:→ hsm926: 是在問是不是C的寫法,也算是有點相關吧.. 10/02 22:07
11F:→ hsm926: 實際程式很亂&複雜,不好意思放上來,我再想其他辦法好了 10/02 22:09
12F:→ Killercat: lldb看出問題的.m有沒有currupt啊.... 10/02 22:24
13F:→ Killercat: 先看debug mode能不能重現 不能重現就很麻煩了 10/02 22:25
14F:→ hsm926: 特定物件,每次都能重現,且在固定位置. 10/02 22:31
15F:→ hsm926: A檔就是把它結構陣列裡面變數填值, B就LibUSB沒在做什麼事 10/02 22:32
16F:→ hsm926: 等A檔填值的動作做很多次, B指標裡面記憶體就被蓋到了.. 10/02 22:34
17F:→ hsm926: 我研究一下lldb好了,感謝K大與以上大大 10/02 23:19
18F:推 ho83leo: xcode version 8.0 ? 10/03 23:34
19F:→ hsm926: Xcode 7.0 10/04 00:35