C: Освободить каждый malloc или только основной? - PullRequest
0 голосов
/ 13 мая 2011

У меня есть указатель *** resultSet, который я передаю в качестве параметра моей функции SQL, которая считывает неизвестное количество данных из БД. Фактическая обработка данных происходит вне функции.

При очистке этой конструкции указателя я просто освобождаю основной указатель один раз и освобождаю все последующие выделения или мне нужно освобождать все созданные мной malloc?

while((row = mysql_fetch_row(result))) {

                // allocating the rows pointer
                resultSet = malloc(sizeof(void)*(int)mysql_num_rows);
                (*rows)++;

                for (i=0 ; i < mysql_num_fields(result); i++)               
                {
                // allocating the fields pointer
                *(resultSet+i) = malloc(sizeof(void)*(int)mysql_num_fields);

                // allocating the character pointer
                **resultSet = malloc(sizeof(char)*strlen(row[i])+1);
                (*fields)++;

                snprintf(**resultSet, strlen(row[i])+1, "%s", row[i]);
                printf("%s\t",**resultSet);
                if (i==6)
                {
                printf("\t %s\n",**resultSet);
                }
                }
    }

Ответы [ 4 ]

9 голосов
/ 13 мая 2011

Как правило, для каждого malloc() у вас есть free().

1 голос
/ 13 мая 2011

free() освобождает область памяти, на которую указывает ptr, которая должна быть возвращена предыдущим вызовом malloc(), calloc() или realloc().

Он делает именно то, что говорит - освобождает указанную память. Он не смотрит на то, что хранится в этой памяти; он не имеет ни малейшего представления о другой выделенной памяти. Это просто освобождает то, что вы говорите. Итак, как уже говорили другие, если вы хотите освободить всю выделенную память, вы должны free все, что вы malloc изд.

(Возможно, вы думали о более сложном поведении C ++, где, когда вы уничтожаете объект, его члены также уничтожаются?)

0 голосов
/ 13 мая 2011

Вам нужно будет в основном работать в обратном порядке и освобождать каждое выделение.

0 голосов
/ 13 мая 2011

Вы должны звонить free() за каждый указанный вами malloc(), чтобы предотвратить утечку памяти.

...