Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Guest u24563

Dúvida-Free ponteiros

Mensagens Recomendadas

Guest u24563

Boa tarde. Estou aqui com um problema na libertação de memória e não consigo perceber como o resolver.

Se me pudessem dar uma ajuda, agradecia bastante ;)

Basicamente, o programa baseia-se na execução de um algoritmo de Dijkstra com um heap.

A estrutura do heap é a seguinte:

typedef struct t_MinHeapNode{
   int v;
   int dist;
}MinHeapNode;

typedef struct t_MinHeap{
   int size;     
   int capacity; 
   int *pos;    
   MinHeapNode **array;
}MinHeap;

As funções de alocação de memória são estas:

MinHeapNode* newMinHeapNode(int v, int dist){
 MinHeapNode *minHeapNode=NULL;

 minHeapNode=(MinHeapNode*)malloc(sizeof(MinHeapNode));
 if(minHeapNode==NULL){
 putchar('\n');
 perror("ERRO=>Memória [minHeapNode] ");
 putchar('\n');
 exit(-1); 
 }
 minHeapNode->v=v;
 minHeapNode->dist=dist;

 return minHeapNode;
}

MinHeap* createMinHeap(int capacity){
MinHeap *minHeap=NULL;

 minHeap=(MinHeap*)malloc(sizeof(MinHeap));
 if(minHeap==NULL){
 putchar('\n');
 perror("ERRO=>Memória [minHeap] ");
 putchar('\n');
 exit(-1);   
 }
 minHeap->pos=(int*)malloc(capacity*sizeof(int));
 if(minHeap->pos==NULL){
 putchar('\n');
 perror("ERRO=>Memória [minHeap->pos] ");
 putchar('\n');
 exit(-1);   
 }
 minHeap->size=0;
 minHeap->capacity=capacity;
 minHeap->array=(MinHeapNode**)malloc(capacity*sizeof(MinHeapNode*));
if(minHeap->array==NULL){
 putchar('\n');
 perror("ERRO=>Memória [minHeap->array] ");
 putchar('\n');
 exit(-1);
}      

 return minHeap;
}

E estas funções são chamadas no início do algoritmo:

void ElectedRoutes(Graph *G, int src){
/* ... */
minHeap=createMinHeap(V);
/* inicializações */
 for(v=0; v<V; v++){
  dist[v]=INF;
  last[v]=UDEF;
  minHeap->array[v]=newMinHeapNode(v, dist[v]);
  minHeap->pos[v]=v;
   prev[v]=UDEF;
 }

 minHeap->array[src]=newMinHeapNode(src, dist[src]);
 minHeap->pos[src]=src;
/* ... */

A minha função free é a seguinte:

for(i=0; i<V; i++){
 free(minHeap->array[i]);
}
free(minHeap->array);
free(minHeap->pos);
free(minHeap);

No entanto, quando corro o programa, dá-me sempre um erro e o programa aborta:

*** Error in `./net': double free or corruption (fasttop): 0x00000000019b9450 ***

Mais uma vez, se me pudessem ajudar, agradecia bastante. Quaisquer outra informação que achem necessária, perguntem ;)

Editado por u24563
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1º - inicializa todos os elementos do array minHeap->array a nulo, seja com um ciclo, com o memset ou usar o calloc em vez do malloc

2º - na função de libertar a memória, só chamas a função free sobre os elementos do array que não tenham o valor de nulo


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.