Я написал программу, использующую стек ADT.
Основной создает новый стек, давая 3 функции для использования с пользователем:Бесплатный указатель от внешней функции
Stack my_stack = sCreate (copy_int, free_int, print_int);
, когда я взываю к функции «прятки»:
printf ("Peek: |%d|\n\n", *(int*)sPeek(my_stack));
у меня есть утечка памяти.
РЕЕК функция выглядит следующим образом:
Element sPeek (Stack stack){
if ((NULL == stack) || (0 >= stack->used_places))
return NULL;
Element returnElement = stack->copy_function(stack->stack_array[stack->used_places-1]);
if (NULL == returnElement){
free (returnElement);
return NULL;
}
return returnElement;
Это вызвано, вероятно, по copy_function называется там, который является copy_int, который был дан пользователем:
Element copy_int (Element element){
int *new_int = (int*) malloc(sizeof(int*));
*new_int = *(int*)element;
if (NULL != new_int)
return new_int;
else
return NULL;
Как я освобождаю указатель (malloc) из copy_int?
Непосредственная связь с вашей проблемой, но действительно ли вы думаете, что выделение пространства для одного указателя int ('malloc (sizeof (int *))') является хорошей идеей? –
Вы предлагаете сделать то же самое в стеке? Я имею в виду без malloc? –
По возможности вы должны стараться не использовать с помощью 'malloc', в этом случае вам вообще не нужно' malloc', вы можете просто вернуть 'int' без использования malloc:' return * (int *) element; ' – ex0ns