【问题标题】:Free memory outside function函数外释放内存
【发布时间】:2012-03-31 22:50:46
【问题描述】:

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

【问题讨论】:

  • 不应该是free(mess)吗?

标签: c memory-management memory-leaks


【解决方案1】:

没错,它会泄漏内存。但是,只要您记得释放该函数的返回值,就应该没问题。

【讨论】:

  • 在您丢失对已分配内存的引用之前,它不会真正“泄漏”内存。完全可以正确使用 OP 的代码。将此与 { malloc(10); } 进行对比,实际上 泄漏
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您将像这样使用自己的函数:

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

    然后你就不会有内存泄漏了。

    【讨论】:

      【解决方案4】:

      没关系,有时你必须这样做,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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 2016-11-06
        • 2020-07-22
        相关资源
        最近更新 更多