Должен ли я использовать free() в подфункции после malloc()?

#c #malloc #dynamic-memory-allocation #free

#c #malloc #динамическое выделение памяти #Бесплатно

Вопрос:

В моем проекте есть подфункция. В этой функции мне нужно временно сохранить мои данные. Итак, я использую malloc() , я не уверен, нужно ли использовать free() ?

 void *hash2(unsigned char *mes, element_t d)
{
    size_t iterations = strlen(mes) / 8;
    unsigned char *rtemp = malloc(32 * sizeof(char));
    SHA256(mes, iterations, rtemp);
    element_from_hash(d, rtemp, 32);
    free(rtemp);
}
 

Ответ №1:

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

Обратите внимание, что ваша функция *hash2(...) , имеющая void* возвращаемый тип, должна возвращать значение, если вам это не нужно, используйте void вместо этого.

В вашем конкретном коде кажется, что вам все равно не нужно использовать malloc , вы можете использовать локальный массив unsigned char rtemp[32]; . malloc это тяжелая функция, которая включает системные вызовы, если вы можете избежать этого, вы должны.

Ответ №2:

Да, поскольку вы больше не используете выделенную память, вы должны освободить ее.

Как только вы вернетесь из вызова функции, у вас не будет возможности получить доступ к выделенной памяти, следовательно, ее нельзя освободить. Итак, вам нужно передать указатель на free() перед выходом из области действия функции (как показано во фрагменте), чтобы избежать утечки памяти.