2012-03-31 124 views
0

這是正確的,它會在C中泄漏內存嗎?外部空閒內存功能

unsigned char * prep(int length,int args, ...) 
{ 
    unsigned char *message = (unsigned char *) malloc(length); 

    va_list listp; 
    va_start(listp, args); 

    int i = 0; 
    int len = 0; 
    unsigned char *source_message ; 
    int step = 0; 
    for(i = 0 ; i < args; i++) 
    { 

    source_message = va_arg(listp, unsigned char *); 
    len = va_arg(listp, long); 
    memcpy(message+step, source_message, (long) len); 
    step+=len; 

    } 
    va_end(listp); 
return message; 
} 

比調用它,並且釋放指針外

unsigned char *mess = prepare_packet_to_send(some vars here); 
free(*mess); 
+3

它不應該是免費的(亂七八糟)嗎? – Rookie 2012-03-31 22:58:35

回答

0

這很好,有時你必須這樣做,C函數strdup()也是這樣,你只需要遵循約定在使用後釋放它。但是我在代碼中看到了一個更大的問題,實際上允許編寫更多的數據而不是分配的大小。 這是爲了糾正這種嘗試:

unsigned char * prep(int length,int args, ...) 
{ 
int i = 0; 
int len = 0; 
unsigned char *source_message ; 
int step = 0; 
unsigned char *message = (unsigned char *) malloc(length); 
va_list listp; 
va_start(listp, args); 
for(i = 0 ; i < args && step <= length; i++) { 
    source_message = va_arg(listp, unsigned char *); 
    len = va_arg(listp, long); 
    memcpy(message+step,source_message,(step+len >length)?length-step:len); 
    step+=len; 
} 
va_end(listp); 
return message; 
} 

使用等。

char * p = prep(size,2,"message 1",9,"message 2",9); 
if (p) { 
.... work with p.... 
    free(p); 
} 
2

這是正確的,這將導致內存泄漏。只要你記得釋放該函數的返回值,你應該沒問題。

+1

它沒有真正「泄漏」內存,直到你失去了對分配內存的引用。完全可以正確使用OP的代碼。與'{malloc(10); }',這實際上*泄漏*。 – 2012-03-31 23:07:14

2

這是完全合法的。函數可能會返回意圖在其他地方釋放的內存。實際上,您使用的malloc函數具有此確切的合約行爲。

我沒有仔細檢查過你的代碼,以確認沒有其他問題,但返回malloc的內存絕對不是問題。

1

您將使用自己的函數是這樣的:

unsigned char *p = prep(100, 1, "hello", 3); 
// ... 
free(p); 

,然後你就沒有內存泄漏。