这是正确的,是否会泄漏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);
答案 0 :(得分:2)
这是正确的,它会泄漏内存。只要你记得释放该函数的返回值,你应该没问题。
答案 1 :(得分:2)
这是完全合法的。函数可能返回要在其他位置释放的内存。实际上,您使用的malloc函数具有这种确切的契约行为。
我没有仔细检查您的代码以确认没有其他问题,但返回malloc'd内存肯定不是问题。
答案 2 :(得分:1)
您将使用自己的功能:
unsigned char *p = prep(100, 1, "hello", 3);
// ...
free(p);
然后你就没有内存泄漏。
答案 3 :(得分: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);
}