看板 C_and_CPP 關於我們 聯絡資訊
前文恕刪。判斷 interval 之演算法我認為你會比我更熟, 我能建議的只有程式語言面而已。 http://codepad.org/9SPjxJHW 我截取原始碼重點出來 float* get_interval(float rect[4][2], float vector[2]){ float *minmax = (float*)malloc(2*sizeof(float)); /* 以 rect, vector 對 minmax 作運算 */ return minmax; } int is_intersect(float car[4][2], float box[4][2]){ int i; for(i=0; i<4; ++i){ float vector[2]; float *car_interval,*box_interval; if(i>=3) { /* dosomething */ car_interval = (float*)get_interval(...); box_interval = (float*)get_interval(...); } else { /* dosomething */ car_interval = (float*)get_interval(...); box_interval = (float*)get_interval(...); } /* 下面的問題依舊一樣 */ } } 你再仔細分析一下你的寫法,每次在 for-loop 裡面都在進行到 malloc 動作, 而且每次都是用 car_interval 與 box_interval 都重新指向一份新的記憶體位置, 這在 memory address 所代表的並不一樣,以car_interval 為例,i=0 時可能長這樣 ┌────┬────┬────┬────┬────┬────┐ │Addr │0x0080 │ 0x84 │ │ │ │ ├────┼────┼────┼────┼────┼────┤ │Variable│ c[0] c[1] │ │ │ │ └────┴────┴────┴────┴────┴────┘ 但在 i=1 時又進行了一次 malloc, 而 car_interval 又指向了新的空間去 ┌────┬────┬────┬────┬────┬────┐ │Addr │0x0080 │ 0x0084 │... │ 0x00c0 │ 0x00c4 │ ├────┼────┼────┼────┼────┼────┤ │Variable│ c[0] c[1] │... │ c[0] c[1] │ └────┴────┴────┴────┴────┴────┘ memory leak here new allocate space(i=1) 以上的動作, 從 i=0 ~ 3 都重覆了進行一次, (在你的程式碼裡嚴格說來,每個 i 都進行了兩次), 所以記憶體指到的並不是同一塊, : 我猜是因為在get_interval函式宣告 minmax[2]的時候都是用同一塊記憶體 這種確定的事情就別猜了,若你沒做 free 動作,它們並不會是在同一塊裡面。 : 所以car_interval的值就被box_interval呼叫get_interval的那行改掉了 : 只有用malloc才不會發生這樣的問題.. 我認為你對記憶體管理有所誤解才會產生這種幻覺。 用 float minmax[2]; 和 float *minmax=(float*)malloc(sizeof(float)*2); 這兩個最終在記憶體分配上效果是一樣的。 (扣除一些鎖碎與此問無關之細節外) 你仔細想想,你要做的是 minmax[2], 或是 minmax[4][2] ? 在每次 for-loop 時,minmax(i=0) 會不會參考到 minmax(i=1) 之情況? : 如果都是指向同一塊記憶體的話 : 應該就算在不同函式裡面malloc和free都沒有關係...吧? 不對, get_interval 每次回傳出來的位置址並不保證一樣 如果沒 free 的話肯定不一樣;如果有 free 的話也不保證和上次配置的一樣; 即使配置的「位置」一樣,你也不能保證裡面的值會是什麼(除非你有 assign 過) get_interval 應該是你從哪 「參考」 過來的呢?說明已如上述, 在你不懂這隻函式用意前,不適合討論你整個程式。或許, Write down your algorithm by step 對你自己,對其他版友,可能會較有幫助。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41