2012-03-27 18 views
7

Mam zamiar napisać plik Mex, więc mogę użyć mojego kodu C++ w MATLAB.C++/MATLAB Mex wiążące

Ten kod jest zbudowany wokół klasy singleton (w języku C++).

Czytałem, że dla pamięci być trwałe muszę używać MxAlloc isntead of malloc/new, jest to prawda dla wszystkich pamięci używam? Np. Klasa, której używam, używa wektorów, a wektory automatycznie przydzielają nową pamięć za pomocą standardowych mechanizmów.

Tak więc wektor w klasie przydzielonej za pomocą MxAlloc ma problemy z utrzymaniem jego pamięci?

+0

Świetne pytanie - ten problem nie jest bardzo dobrze wyjaśniony w dokumentacji. Słyszałem o ludziach, którzy niepotrzebnie przepisywali całe biblioteki myśląc, że muszą zmienić każde wezwanie pamięci, aby było kompatybilne z MEX. –

+0

Dziękujemy! Przepisywanie jest dokładnie tym, czego chciałem uniknąć, ponieważ biblioteka jest wciąż rozwijana i spowodowałoby to, że mam 2 instancje biblioteki, jedną dla pracy c/C++ i jedną dla prototypowania MATLAB. –

+0

Pamiętaj jednak, że istnieją dalsze subtelności, których nie jestem do końca pewien. Na przykład, jeśli plik Mex zostanie przerwany (np. Przez błąd), pamięć przydzielona za pomocą standardowych metod C * może * nie zostać prawidłowo zwolniona ... dalsze docenianie tego punktu przez osoby w tym dziale będzie mile widziane! –

Odpowiedz

7

Używasz tylko MxAlloc dla danych, które zamierzasz powrócić do Matlaba. Wszystko, co pozostaje w twojej bibliotece, może być przydzielone normalnie.

Jednym z problemów, o których warto pamiętać, jest możliwość wyładowania biblioteki w dowolnym momencie. Zwykle, gdy użytkownik wywołuje funkcję MEXFunction, biblioteka jest ładowana i pozostanie załadowana do kolejnych wywołań. Jednak w dowolnym momencie Matlab może zwolnić twoją bibliotekę, a więc wszystkie zasoby twojej funkcji MexFunction zostaną zwolnione.

+3

Jeśli to konieczne, możesz użyć mexLock http://www.mathworks.co.uk/help/techdoc/apiref/mexlock.html, aby zatrzymać usuwanie pliku mex. – Edric