【问题标题】:Memory Leak in Returning a Pointer and Freeing it in C在 C 中返回指针并释放它时的内存泄漏
【发布时间】:2013-11-14 12:02:04
【问题描述】:

我有以下代码:

char *get_packet(int cc, char *args[]){

    char *packet;
    packet = (char*) malloc(30 * sizeof(char));

    //other code..

    ...

    return packet;
}

int main(){

    int cc = SCANS_TO_ACCUMULATE;
    int args[] = {5000};

    char *str_args[15];
    int i = 0;
    for(i; i<((sizeof(args)/sizeof(args[0]))); i++){
           char buffer[10];
           sprintf(buffer, "%d", args[i]);
           str_args[i] = strdup(buffer);
           free(buffer);
    }
    str_args[i] = NULL;

    char *pkt;
    pkt = get_packet(cc, str_args);
    printf("%s\n", pkt);
    free(pkt);
    pkt = NULL;
    getchar();

    return 0; 
}

但是,运行它会导致我的程序立即崩溃,并且在与 Dr. Memory 进行了一些检查后,我似乎有内存泄漏,但我似乎无法找到它发生的原因。我没有正确释放 malloc 的内存吗?在此先感谢

【问题讨论】:

  • buffer 不是动态分配的,不应被释放。

标签: c pointers memory-leaks malloc free


【解决方案1】:

释放本地数组“缓冲区”是未定义的,可能是可怕的行为!除非它是用 malloc() 或 calloc() 分配的,否则你不能释放它。它可能会损坏堆并导致崩溃。

【讨论】:

    【解决方案2】:

    您的代码尝试取消分配未动态分配的buffer 内存,即这是一个局部变量数组。这会导致崩溃。

    【讨论】:

      【解决方案3】:

      这里:

      char buffer[10];
      ...
      free(buffer);
      

      您不能释放本地数组,请删除对free 的调用。当变量超出范围时,内存将自动释放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2020-10-28
        • 2013-10-31
        • 2015-12-15
        • 2016-10-23
        相关资源
        最近更新 更多