2014-10-08 51 views
3

考慮一個結構,讓我們說一下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對象的屬性實際上應該是指針,它們指向的空間分配給它們的任何地方。

我不知道這是否必然是常規的 -​​ 如果我的理解是正確的,這種情況通常如何處理?

+2

我已經看到了你的情況下提到創建/銷燬方面的動態分配,其中該結構的實施不知道調用者 - 前向聲明,例如調用者無法實例化不完整類型的地方。 – polarysekt 2014-10-08 03:49:52

回答

1

始終創建並行createdestroy功能(即使destroy僅僅是free通話),一般避免直接訪問其成員函數(使其不透明如果可能的話)。

List *ListCreate(Foo *arg) { List *rv = calloc(1, sizeof(List)); rv.arg = arg; return rv; } 
void ListDestroy(List *lst) { free(lst); } 
0

您提出的解決方法是常規方法。 在調用函數做:

struct List ls; 
在調用函數

然後:

int ListCreate(*foo fum, struct List *ls) { 

    ls->foo = fum; 
    ls->data = 0; 

    return 0; 
}