我知道指向malloced資料的指標需要在適當的時候被釋放。
例如:
Item* items = (Item*)malloc(sizeof(Item) * 1) 。
^當我完成了這個,我就得把它釋放出來。有道理。
但是,請考慮以下結構:
typedef struct Items {
矢量*水果。
} 專案。
其中Vector是:
typedef >struct Vector {
void** data;
int size。
} 向量。
假設我已經為Items結構分配了記憶體,并且Vector成員包含,例如,3個專案(另一個結構Boxes)。
如果我有一個Boxes指標變數來參考Items結構中Vector的第二個成員,在使用后是否需要被釋放?
// `box1`是否需要明確地被釋放?
Boxes* box1 = items-> fruits[1]; // `items`是`Items`型別。
我理解那個變數box1并沒有明確地進行堆分配。只有堆分配的指標才需要被釋放嗎?
uj5u.com熱心網友回復:
man malloc/free
malloc()函式分配大小位元組,并回傳一個指向所分配記憶體的指標。...
free()函式釋放了ptr所指向的記憶體空間,它必須是由先前呼叫malloc()回傳的, ...
這就是說,由
malloc回傳的地址必須在后面傳遞給free,中間沒有任何東西。每個
malloc后面必須有一個相應的free。
uj5u.com熱心網友回復:
如果你執行這個:
Boxes* box1 = items->fruit[1] 。
那么box1和items->fruit[1]是同一個指標;它們指的是同一個物件,在記憶體中有一個地址。
如果你呼叫free(items->fruit[1]),那么items->fruit[1]將成為一個無效的指標。因為box1正是那個指標,它也變成了無效的指標。
如果你知道items->fruit[1]的記憶體管理在其他地方被處理了,而你只是想為它的一些代碼塊取一個更短的名字,那么為這個物件創建一個別名通常是安全的,比如box1。
你必須絕對確定你不會在程式中的某個時刻繼續使用box1,在這個時刻,box1仍然在詞法范圍內(所以訪問這個變數本身是順利的),但是一些代碼已經被執行,并且已經破壞了items->fruit[1],以至于box1已經無形中,隱蔽地變得無效了。
如果你有一些代碼有一個box1的別名,而它所呼叫的一些函式有可能會破壞items->fruit[1],并用一個新的指標來替換這個指標。在這種情況下,你可以撿到新的值:
Boxes *box1 = items->fruit[1]。
maybe_replaces_items(items); // items->fruit[1] 可能被覆寫。
box1 = items->fruit[1]; //拾取最新的fruit[1]。
這種事情是bug的來源。
你知道那句計算機諺語嗎?"計算機科學中只有兩件難事:快取失效和命名事物"?那么,這就是快取失效。box1是某個指標的快取副本,該指標可能已經失效,必須被重繪 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/315429.html
標籤:
下一篇:雙重指標和底層指標
