我有一个问题,我正在使用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);
}
我的问题是这个sentece在堆栈或堆中分配内存?这可能导致内存泄漏,因为在for循环中进行? 这相当于制作一个malloc并且在循环结束时是免费的吗?
size_t size_of_tmp = sizeof(char) * (HOSTLINK_CONFIG_STRING_MAX_LEN * (categories[i].key_len));
char tmp[size_of_tmp];
答案 0 :(得分:0)
由于您没有执行任何malloc
,因此在此特定代码段中不会出现内存泄漏。但是,您无法声明具有非常量大小的tmp
数组。也就是说,你不能说char tmp[size_of_tmp]
size_of_tmp
不是常数(这不是因为它取决于categories[i].key_len
)。
可以做的是使用malloc
或calloc
为堆上的数组分配内存,就像这样
char *tmp = (char*)malloc(size_of_tmp);
或者
char *tmp = (char*)calloc(size_of_tmp, sizeof(char));
calloc
已将所有已分配的内存初始化为零,因此您不必使用memset
。
如果要避免内存泄漏,则必须在每次循环迭代结束时free
分配tmp
数组。