2010-04-26 3 views
3

Вот что я работаю с:Как я могу освободить всю выделенную память сразу?

char* qdat[][NUMTBLCOLS]; 
char** tdat[]; 
char* ptr_web_data; 

    // Loop thru each table row of the query result set 
    for(row_index = 0; row_index < number_rows; row_index++) 
    { 
     // Loop thru each column of the query result set and extract the data 
     for(col_index = 0; col_index < number_cols; col_index++) 
     { 
      ptr_web_data = (char*) malloc((strlen(Data) + 1) * sizeof(char)); 
      memcpy (ptr_web_data, column_text, strlen(column_text) + 1); 
      qdat[row_index][web_data_index] = ptr_web_data; 
     } 
    } 

    tdat[row_index] = qdat[col_index]; 

После использования этих данных, память, выделенная отпускается по одному, используя свободный().

for(row_index = 0; row_index < number_rows; row_index++) 
{ 
    // Loop thru all columns used 
    for(col_index = 0; col_index < SARWEBTBLCOLS; col_index++) 
    { 
    // Free memory block pointed to by results set array 
    free(tdat[row_index][col_index]); 
    } 

} 

Есть ли способ освободить всю выделенную память сразу, для этого массива?

Thank you.

+0

Знаете ли вы заранее, насколько велики ваши ячейки памяти? – Anycorn

+0

нет ................ –

ответ

13

Не со стандартным распределителем malloc() - вам нужно исследовать использование пулов памяти. Они работают, выделяя большой блок памяти вверх, выделяя его и освобождая обратно, когда вы запрашиваете через свои собственные функции распределения, а затем освобождаете всю партию специальной функцией «освободить все».

Должен сказать, что я всегда находил эти вещи немного уродливыми - на самом деле не так сложно писать код, который не течет. Единственная причина, по которой я могу их использовать, - уменьшить фрагментацию кучи, если это для вас настоящая проблема.

+0

+1 для второго абзаца и вызова лень. –

5

Нет, нет. Память, которая отдельно распределена, должна быть отдельно освобождена.

Единственный способ, которым вы могли бы освободить его как раз, - это если вы выделили его сразу, это гигантский блок. Затем вам нужно будет немного вычислить указатель, чтобы назначить каждой строке правильный индекс в массив, но это не очень сложно. Такой подход имеет несколько недостатков, хотя

  1. Extra математикой указатель
  2. Требуется один гигантский непрерывный блок памяти по сравнению с N небольших блоков памяти. Может быть проблемой в условиях низкой памяти или высокой степени фрагментации.
  3. Дополнительная работа без реального заявленного усиления.
5

Если вы хотите отпустить все сразу, вам нужно выделить все сразу.

Простое ручное решение, если вы знаете общий размер, который вам понадобится заранее, заключается в том, чтобы выделить все его в один раз и указать в нем соответствующий индекс. Если вы заранее не знаете размер, вы можете использовать realloc для увеличения объема памяти, пока вы только обращаетесь к нему с индексом исходного указателя и не храните дополнительные указатели в любом месте.

Это, как говорится, прямое распределение и освобождение является простым решением и труднее ошибиться, чем альтернативы. Если цикл для освобождения не вызовет реальных трудностей, я буду придерживаться того, что у вас есть.