2013-08-08 3 views
-1

стек проблема компиляции я уже получил qestion, я использую sourgery C++ набор инструментов, и компилятор оставить меня написать эту фразу:памяти кучи утечки и 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); 
} 

Мой вопрос заключается в следующем Alloc память sentece в стеке или в куче? Это может привести к утечке памяти, поскольку она выполнена в цикле for? Является ли это эквивалентом для создания malloc и в конце цикла Free?

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

    char tmp[size_of_tmp]; 

ответ

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 в конце каждой итерации цикла.

+0

Вы _can_ объявляете массив переменной, не являющейся константой, в C++. – mah

+0

и в C++ этот стек использования? – user2387829

+0

@mah Вы уверены? Я имею в виду, что он был в стандарте, но, видимо, > нет стандартного C++, когда-либо принятого VLA от C99, поэтому технически факт допуска VLA в C++ является расширением g ++. см. [Этот ответ] (http://stackoverflow.com/a/5730286/2640170) ... – PoByBolek

Смежные вопросы