Как я могу освободить всю выделенную память одновременно? - PullRequest
3 голосов
/ 27 апреля 2010

Вот с чем я работаю:

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];

После использования данных выделенная память освобождается по одному с помощью free ().

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]);
  }

}

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

Спасибо.

Ответы [ 3 ]

13 голосов
/ 27 апреля 2010

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

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

5 голосов
/ 27 апреля 2010

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

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

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

5 голосов
/ 27 апреля 2010

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

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

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