-1

我有一个问题,我正在使用 sourgery c++ 工具链,编译器让我写这句话:

for(i=0;i<size_of_categories;i++){

    size_t size_of_tmp = sizeof(char) * (HOSTLINK_CONFIG_STRING_MAX_LEN * (categories[i].key_len));

    char tmp[size_of_tmp];
    memset(tmp,0,(size_of_tmp));    
    get_hostlink_count[i]++;

    if(categories[i].time == get_hostlink_count[i]){

        if(format == CSV){

            csv_this_category_values(categories,i,tmp,size_of_tmp);
            strncat(buffer,tmp,buff_len);

        }else if (format == JSON){

            xi_json_this_category_values(categories,i,tmp,size_of_tmp);
            js_this_cat = json_loads(tmp,JSON_DECODE_ANY,NULL);
            json_array_extend(js_arr,js_this_cat);

            json_array_clear(js_this_cat);
            json_decref(js_this_cat);
        }

        get_hostlink_count[i] = 0;

    }
    //Free(tmp);
}

我的问题是堆栈或堆中的这个句子分配内存?这可能会导致内存泄漏,因为是在 for 循环中进行的?这是否等同于创建一个 malloc 并在循环结束时创建一个 Free?

size_t size_of_tmp = sizeof(char) * (HOSTLINK_CONFIG_STRING_MAX_LEN * (categories[i].key_len));

    char tmp[size_of_tmp];
4

1 回答 1

0

由于您没有执行任何mallocs,因此在这段特定的代码中不会出现内存泄漏。但是,您不能tmp使用非常量大小声明您的数组。char tmp[size_of_tmp]也就是说,你不能说size_of_tmp不是恒定的(这不是因为它取决于categories[i].key_len)。

可以做的是像这样在堆上为您的数组使用malloccalloc分配内存

char *tmp = (char*)malloc(size_of_tmp);

或这个

char *tmp = (char*)calloc(size_of_tmp, sizeof(char));

calloc已经将所有分配的内存初始化为零,因此您不必使用memset.

如果要避免内存泄漏,则必须在每次循环迭代结束时free分配数组。tmp

于 2013-08-08T11:10:57.067 回答