es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Doble liberación detectada en tcache 2.

La pregunta pide eliminar los nodos de datos pares de una lista enlazada simple.
Este es mi fragmento de código:

void deleteEven (node **head){
    node *prev, *curr,*del;
    curr=*head;
    prev=NULL;
    while(curr!=NULL){
        if((curr->data)%2==0){
            if(prev==NULL)
            {
                del=curr;
                *head=curr->next;
            }
            else
            {
                del=curr;
                prev->next=curr->next;
            }
            free(del);
        }
        else
        {
        prev=curr;
        curr=curr->next;
        }
    }
}

Da el siguiente error:

free(): double free detected in tcache 2
Aborted (core dumped)

Por favor, explique la causa del error y cómo puedo corregirlo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “free (): detección de doble liberación en tcache 2” indica que el código está intentando liberar dos veces la misma ubicación de memoria. Esto podría suceder si el puntero “del” no se actualiza correctamente antes de llamar a “free”.

    En este caso, parece que el puntero “del” se establece correctamente cuando se encuentra un nodo de datos par, pero no se actualiza cuando se encuentra un nodo de datos impar. Esto significa que cuando un nodo par es seguido por un nodo impar, el código intenta liberar la misma ubicación de memoria dos veces, lo que resulta en un error.

    Para resolver este problema, debe actualizar el puntero “del” para cada nodo que deba eliminarse, independientemente de si tiene datos pares o impares. Una forma de hacer esto es mover la declaración “del = curr” fuera del bloque if-else, de la siguiente manera:

    void deleteEven (node **head){
    node *prev, *curr,*del;
    curr=*head;
    prev=NULL;
    while(curr!=NULL){
    if((curr->data)%2==0){
    if(prev==NULL)
    {
    *head=curr->next;
    }
    else
    {
    prev->next=curr->next;
    }
    del=curr;
    curr=curr->next; // actualiza el puntero actual antes de liberar la memoria
    free(del);
    }
    else
    {
    prev=curr;
    curr=curr->next;
    }
    del=curr;
    }
    }

    Con esta modificación, el puntero “del” se establece correctamente para cada nodo que debe eliminarse, y se libera antes de pasar al siguiente nodo. Esto debería evitar el error de doble liberación.

Comments are closed.