考慮一個結構,讓我們說一下List,以及一個函數返回一個名爲ListCreate()的新List。 ListCreate()將一個對象指針作爲參數,這是List的一個屬性。什麼時候malloc結構和「創建」功能在C
現在據我的理解,分配堆內存應該由調用者處理。
最初,我的ListCreate()爲要返回的新List對象分配了內存,並返回了一個指向該List對象的指針。這似乎沒有引起任何問題,但我意識到現在讓主叫方照顧它是有意義的。
什麼混淆我雖然是,如果我創建一個列表對象,像這樣:
List* ListCreate(*foo fum) {
struct List ls;
ls.foo = fum;
ls.data = 0;
return &ls;
}
...然後列表(ls.foo)屬性只在本地這個功能存在。因此,當我將ls返回給main()中的List指針時,它將List對象分配給自己的內存,我的理解是ls.foo,ls.data(以及其他任何潛在屬性)和ls不再有意義
我想到的一個可能的解決方案是讓ListCreate()也爲堆中的List對象的屬性分配內存,然後讓它的互補ListDestroy()函數處理釋放該內存,但是接下來我假設所有的List對象的屬性實際上應該是指針,它們指向的空間分配給它們的任何地方。
我不知道這是否必然是常規的 - 如果我的理解是正確的,這種情況通常如何處理?
我已經看到了你的情況下提到創建/銷燬方面的動態分配,其中該結構的實施不知道調用者 - 前向聲明,例如調用者無法實例化不完整類型的地方。 – polarysekt 2014-10-08 03:49:52