2012-03-31 8 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

答えて

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); } '、実際に*漏れ*。 –

2

これは完全に合法です。関数は、他の場所で解放される予定のメモリを返すことがあります。実際、使用するmalloc関数は、この正確な契約上の振る舞いを持っています。

他の問題はないことを確認するためにコードを慎重に踏んだわけではありませんが、mallocされたメモリを返すことは間違いありません。

1

あなたはこのように、独自の機能を使用します。

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

、その後、あなたは何のメモリリークを持っていないでしょう。

関連する問題