Erro ao liberar a memória na freeListaUtil

Erro ao liberar a memória na freeListaUtil

por Thiago Gomes -
Número de respostas: 8

Eu fiz a função mostreListaUtil e a função freeListaUtil.

Eu fui rodar o programa e ele rodou normal, só não imprimiu o resultado.

Aí eu fiz a função itensParaValores, eu rodo e ele mostra o prompt, aí eu digito uma expressão qualquer e logo em seguida aparece:

pitao(1117) malloc: *** error for object 0x7fd041a80000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

Por acaso isso ocorre pq a função eval não foi feita?

É estranho pq em nehuma função eu aloco memória. Antes de fazer a itensParaValores isso não tava acontecendo. Por mágica algo parou de ser alocado depois que eu fiz a itensParaValores?

Em resposta à Thiago Gomes

Re: Erro ao liberar a memória na freeListaUtil

por Thiago Gomes -

FATO INTERESSANTE:

Da primeira vez que fiz a itensParaValores eu fiz usando  switch case.

Agora fiz td com if else e funcionou. Acho que no switch eu estava mudando coisas do lugar, apesar de não ter notado isso em nenhum momento.

Em resposta à Thiago Gomes

Re: Erro ao liberar a memória na freeListaUtil

por Fernanda de Camargo Magano -

Eu estou tentando fazer o freeListaUtil e me surgiu uma dúvida que talvez esteja relacionada com esse erro que você teve:

pitao(1117) malloc: *** error for object 0x7fd041a80000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

Não sei se é isso, mas pelo que parece Thiago, você declarou um ponteiro no freeListaUtil, mas o mesmo foi liberado na função freeUtil.

void
freeUtil(CelUtil *pUtil) {

.....

.....

    free(pUtil);
}

 

Contudo, como esse ponteiro somente foi declarado e não alocado dinamicamente, não poderia ser liberado. Não sei se esse é o motivo de ter aparecido esse erro, mas se for pode ser que o programa esteja rodando, mesmo que o erro continue lá.

Então galera, minha dúvida é: eu não posso alocar ponteiros, mas preciso de um para mandar a célula para freeUtil. Se eu apenas declarar um ponteiro, iria dar problema nessa função, já que não poderia dar free na variável que eu não aloquei. Além disso, se não puder alocar, como poderia ter esse ponteiro de volta, já que vou precisar usá-lo novamente. Eu sei que a lista é com cabeça, mas precisaria de um ponteiro intermediário para fazer esse processo, não é?

Eu não sei se estou fazendo confusão com os ponteiros e se entendi corretamente essa função freeListaUtil.

 

Em resposta à Fernanda de Camargo Magano

Re: Erro ao liberar a memória na freeListaUtil

por Thiago Gomes -

Então Fernanda, eu não aloquei nenhum ponteiro na função, mas mesmo assim, os ponteiros que eu inicializei como variáveis locais durante a função, morrem quando ela termina. Acho que eu tava mudando coisa de posição msm.

Em resposta à Fernanda de Camargo Magano

Re: Erro ao liberar a memória na freeListaUtil

por José Coelho de Pina -

Perdi o fio da meada. Vocês resolveram os problemas?

eu não posso alocar ponteiros,

Você não deve alocar memória (= utilizar malloc).
Você pode declarar ponteiros

CelUtil *p;

mas preciso de um para mandar a célula para freeUtil.

É só declarar e usar. Na aula de ontem escrevemos (duas versões de) uma função queueFree() que é muito semelhante a função que vocês devem fazer.

Se eu apenas declarar um ponteiro, iria dar problema nessa função, já que não poderia dar free na variável que eu não aloquei.

Não daria problema. Você não liberaria a área ocupada pelo ponteiro.

free(p);

libera a área/célula que está sendo apontada por p (= libera a área/célula cujo endereço está em p).

 a lista é com cabeça, mas precisaria de um ponteiro intermediário para fazer esse processo, não é

Certo. É só declarar o ponteiro e usar.

Em resposta à José Coelho de Pina

Re: Erro ao liberar a memória na freeListaUtil

por Fernanda de Camargo Magano -

Muito obrigada! As aulas de anteontem e hoje me ajudaram a entender melhor essa função. =D

Em resposta à Fernanda de Camargo Magano

Re: Erro ao liberar a memória na freeListaUtil

por Thiago Gomes -

Hã..... SOCORRO! XD

É o seguinte. Eu terminei a função eval.c. No final ela retorna a célula contendo o resultado.

Quando ela termina, minhas lista fica com apenas 2 células. A célula cabeça e a célula resultado. O ponteiro iniLista aponta para a cabeça. 

Na função freeListaUtil  eu preciso liberar essas duas células. Eu dou free(iniLista);  nada anormal acontece. Agora se eu tento dar free(iniLista->prox) que é a célula contendo o resultado, o negócio explode.

A ordem dos free's está correta, seria:

free(iniLista->prox);

free(iniLista);

Mas ele apresenta o erro ao dar free(iniLista->prox); O erro é:

 pointer being freed was not allocated

Agora me diz como não foi alocado se tá lá compilador?!? Tá maluco? Lógico que foi alocado! XD

Na função eval.c eu não aloquei nenhuma célula. Então essa célula para qual a cabeça aponta está aí desde que a lista foi criada. O que se passa? 

Em resposta à Thiago Gomes

Re: Erro ao liberar a memória na freeListaUtil

por Gabriel Ogawa -

Thiago, dá uma olhada no que o main faz com o resultado.

Nessa parte em específico:

if (resultado) {
printf("Resultado: %f\n", resultado->vFloat);
freeUtil(resultado);
}

A função freeUtil libera uma célula do tipo CelUtil, como o resultado é o seu iniLista->prox, então quando você vai dar o free nisso depois do programa já ter chamado a freeUtil nele, "o negócio explode" ;)