2012-03-31 127 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); 

,然后你就没有内存泄漏。