2012-03-27 20 views
7

Estoy a punto de escribir un archivo Mex, así que puedo usar mi código C++ en MATLAB.C++/MATLAB Mex binding

Este código se basa en una clase singleton (en C++).

He leído que para que la memoria sea persistente tengo que usar MxAlloc isntead de malloc/new, ¿es esto cierto para toda la memoria que uso? Es decir, la clase que tengo usa vectores y vectores asignan automáticamente nueva memoria, usando mecanismos estándar.

¿Un vector en una clase asignada usando MxAlloc tendrá problemas para mantener su memoria?

+0

Gran pregunta: este problema no está muy bien explicado en la documentación. He oído que la gente reescribe innecesariamente bibliotecas enteras pensando que necesitan cambiar cada llamada de memoria para que sea compatible con MEX. –

+0

¡Gracias! La reescritura es exactamente lo que quería evitar ya que la biblioteca aún se está desarrollando y me daría dos instancias de la biblioteca, una para el trabajo de c/C++ y otra para el prototipo de MATLAB. –

+0

Tenga en cuenta, sin embargo, que hay otras sutilezas de las que no estoy del todo seguro. Por ejemplo, si el archivo Mex se interrumpe (por ejemplo, a través de un error), la memoria asignada mediante los métodos estándar C * puede * no ser desasignada correctamente ... ¡se agradecerá más información sobre este punto por parte de personas que lo conocen! –

Respuesta

7

Solo utiliza MxAlloc para los datos que va a devolver a Matlab. Todo lo que queda dentro de su biblioteca se puede asignar normalmente.

Un problema que debe tener en cuenta es que su biblioteca puede descargarse en cualquier momento. Normalmente, cuando el usuario llama a su función mexF, la biblioteca está cargada y permanecerá cargada para llamadas posteriores. Sin embargo, en cualquier momento Matlab puede descargar su biblioteca y así todos los recursos en su función mex podrán ser liberados.

+3

Si es necesario, puede usar mexLock http://www.mathworks.co.uk/help/techdoc/apiref/mexlock.html para evitar que su archivo mex se descargue. – Edric