2016-12-04 38 views
1

我有一個向量struct a,在編譯時不知道大小。malloc是否遞歸地工作?

每個struct a包含一個指向struct b的向量的指針。編譯時不知道向量長度struct b

所以,如果我這樣做:

#include <stdio.h> 
#include <stdlib.h> 

struct b { 
    int n; 
}; 

struct a { 
    int n; 
    struct b *v; 
}; 

int main() { 

    struct a *s; 
    struct a *ta; 
    struct b *tb; 

    s = (struct a*)malloc(sizeof(struct a) * 32); 
    s->v = (struct b*)malloc(sizeof(struct b) * 32); 
    s->n = 1234; 
    ((s->v)+1)->n = 5678; 

    fprintf(stderr, "%p: %i/%p: %i\n", s, s->n, (s->v)+1, ((s->v)+1)->n); 

    ta = s; 
    tb = (s->v)+1; 

    free(s); 
    fprintf(stderr, "%p: %i/%p: %i\n", ta, ta->n, tb, tb->n); 

    return 0; 
} 

輸出例如:

0x1cb3010: 1234/0x1cb3224: 5678 
0x1cb3010: -1526330504/0x1cb3224: 5678 

是否當有相同的指針內分配的內存塊的任何機會的結構向量b自動地得到釋放?或者,我必須首先爲struct a矢量中的每個項目釋放個人struct b載體?

The question on this link已被建議作爲這篇文章的重複,但這裏的問題詢問有關free調用中現有的功能,而不是尋求建議,就如何使一個遞歸過程。

+5

不,你必須手動完成。 –

+2

此外,你不應該''malloc'的結果 – UnholySheep

+4

文檔的哪一部分讓你相信這樣的事情可能是這樣? –

回答

1

對於每個malloc()您必須有一個對稱的free()

如果你在linux環境下工作,你可以使用valgrind來檢查你的程序。

運行:

valgrind --leak-check=full ./my_prog 

和了解你的錯誤

+0

我不知道這個'valgrind'工具。這是一個很好的,建設性的答案,這使得閱讀本文的其他人可以輕鬆證明自己是否存在泄漏。謝謝。 – lash

3

簡短的回答:不,你必須爲每一個mallocfree

更好的回答:仍然沒有,但是你可以寫一個函數來釋放多個結構成員。這裏有一個例子:

void freeStruct(struct a *foo) 
{ 
    free(foo->v); 
    free(foo); 
} 

另外:Don't cast the return value of malloc

+1

'free()'允許'free(NULL)'。類似於free(if)(foo)free(foo-> v);類似於free-function的函數會模仿它的功能, – chux