前文恕刪。判斷 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