繁体   English   中英

空闲内存外功能

[英]Free memory outside function

这是正确的吗,它会在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);

没错,它将泄漏内存。 只要您记得释放该函数的返回值,就可以了。

这是完全合法的。 函数可能会返回要在其他地方释放的内存。 实际上,您使用的malloc函数具有这种确切的契约行为。

我没有仔细检查您的代码以确认没有其他问题,但是返回malloc的内存绝对不是问题。

您将使用自己的函数,如下所示:

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

这样就不会有内存泄漏。

很好,有时您必须这样做,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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM