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.

segmentación de subprocesos múltiples de destructores de fallos

Tengo un error de segmentación cuando se llama a la función unitthreaddata. En realidad, es causado por ~Data(). thread1 está bien, pero thread2 causa el error de segmentación. Todo el código es el siguiente: (perdona el mal estilo de código), la información de error es doble liberación o corrupción. Otros detalles: gcc5.4.0, centos7. ¿Alguna ayuda? ¡Muchas gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema es causado por la doble liberación de memoria en la función unit_thread_data(). Cada hilo crea e inicializa su propio objeto de datos, que es apuntado por el campo d en la estructura thread_data_t correspondiente. Una vez que los hilos completan su trabajo, se llama a la función unit_thread_data() para limpiar la memoria. La función recorre el array pthread_data, liberando cada objeto de datos señalado por el campo d, y luego libera todo el array pthread_data.

    Sin embargo, el problema es que el bucle usa la variable de índice i para indexar el array pthread_data, pero luego usa esa variable de índice para acceder al campo d dentro de pthread_data[i]. Esto resulta en el acceso al campo d de una estructura thread_data_t diferente a la deseada, lo que lleva a la doble liberación de la memoria cuando se libera dos veces el mismo objeto de datos.

    Para solucionar el problema, el bucle en unit_thread_data() debería usar una variable de índice separada para el array pthread_data y el campo d dentro de cada estructura thread_data_t, de esta manera:

    c++
    void unit_thread_data(thread_data_t* pthread_data)
    {
    for(int i=0; i<num_threads; i++)="" {="" delete[]="" pthread_data[i].d-="">A_;
    delete pthread_data[i].d;
    }
    delete[] pthread_data;
    }

    Nótese que la variable num_threads debería ser pasada como argumento a unit_thread_data() o hacerse una variable global para ser usada correctamente.

    Además, es importante destacar que la función _add() también debería manejar correctamente los errores al asignar memoria con new, ya que una falla en la asignación puede causar un comportamiento inesperado o fallas en el sistema.</num_threads;>

Comments are closed.