2012-08-31 11 views
7

Tengo un programa muy simple, que se enumera a continuación, que lee un valor de un archivo .mat (un archivo de datos de Matlab) y lo imprime. Por alguna razón, recibo un error segfault después de salir de main() - Puedo ejecutar gdb my_program y recorrer todo el método, pero tan pronto como termina main(), introduzco algún método en una biblioteca relacionada con Matlab (libmwfl.so, una dependencia de libmat.so) que lanza una segfault.Aparentemente estoy corrompiendo la pila, pero ¿cómo?

Soy completamente nuevo en la programación C, pero algunos leyendo sospecho que de alguna manera soy corrupting the stack o calling some destructor twice. Sin embargo, no puedo ver ninguno de esos en mi código, y como dije, puedo pasar por mi código con el depurador sin problemas.

¿Qué estoy haciendo mal aquí?

#include <stdlib.h> 
#include <stdio.h> 
#include <mat.h> 

int main(int argc, char *argv[]) { 

    double value; 
    MATFile *datafile; 
    datafile = matOpen("test.mat", "r"); 

    mxArray *mxv; 
    mxv = matGetVariable(datafile, "value"); 
    value = *mxGetPr(mxv); 
    mxFree(mxv); 
    matClose(datafile); 

    printf("The value fetched from the .mat file was: %f", value); 

    return 0; 
} 
+3

Si yo estuviera en tu lugar, me gustaría comprobar si archivo de datos es NULL (lo que significaría que el archivo no se pudo abrir). – Gtiou

+0

@GeorgeStamatiou Mirando el programa, por un momento, incluso yo sentí lo mismo. Pero si ese fuera el caso, el programa se habría bloqueado (con toda probabilidad) dentro de 'main' debido a una referencia de puntero NULL y no después de salir' main' como lo indica el OP. La respuesta de Giuseppe Guerrini detectó el problema exacto –

Respuesta

9

La documentación recomienda utilizar la función mxDestroyArray en lugar de mxFree para liberar un mxArray. Al usar mxFree probablemente arruines el montón de matlab. Desde el documentation

incorrectamente Destruir un mxArray

No puede utilizar mxFree para destruir un mxArray.

Advertencia: Está intentando llamar mxFree en una matriz de <class-id>. El destructor para mxArrays es mxDestroyArray; por favor llame al esto en su lugar. MATLAB intentará solucionar el problema y continuará, pero esto dará como resultado errores de memoria en futuras versiones.

Ejemplo que causa Advertencia

En el siguiente ejemplo, mxFree no destruye el objeto array. Esta operación libera el encabezado de estructura asociado con la matriz, , pero MATLAB seguirá funcionando como si el objeto de la matriz necesitara ser destruido. Por lo tanto, MATLAB intentará destruir el objeto array, y en el proceso , intente liberar el encabezado de su estructura nuevamente.

mxArray *temp = mxCreateDoubleMatrix(1,1,mxREAL);

... 

mxFree(temp); /* INCORRECT */

solución.

Llame mxDestroyArray en su lugar.

mxDestroyArray(temp); /* CORRECT */

+0

Esto funciona perfectamente, ¡muchas gracias! Sin embargo, no he visto esa parte de la documentación. ¿Le importaría proporcionar un enlace? (Podría haber más cosas allí que podría utilizar para saber ...;)) –

+1

@TomasLycken Aquí tienes. [Documentación] (http://matlab.izmiran.ru/help/techdoc/matlab_external/ch3_me23.html) –

+0

Aquí: http://www.mathworks.it/help/techdoc/apiref/mxarray.html –

Cuestiones relacionadas