Jednym z powszechnych podejść jest posiadanie kilku funkcji m-plików, które udostępniają interfejs publiczny, np. sysInit.m, sysRefresh.m, itp.
Każdy z tych plików m wywołuje funkcję mex z jakimś uchwytem, ciągiem (lub liczbą) identyfikującą funkcję, która ma zostać wywołana, oraz wszelkie dodatkowe argumenty. Na przykład, sysRefresh.m może wyglądać następująco:
function sysRefresh(handle)
return sysMex(handle, 'refresh')
w funkcji SYSMEX mex, można mieć uchwyt być surowy wskaźnik stosu (łatwe, ale nie bardzo bezpieczne), czy można utrzymać mapowanie w C/C++ od identyfikatora uchwytu do rzeczywistych wskaźników obiektu. To rozwiązanie wymaga trochę dodatkowej pracy, ale jest o wiele bezpieczniejsze. W ten sposób ktoś nie może przypadkowo przekazać dowolnej liczby jako uchwytu, który działa jak zwisający wskaźnik. Możesz także robić bardziej wyrafinowane rzeczy, takie jak użycie funkcji onCleanup, aby zwolnić całą pamięć i zasoby, gdy rozładujesz funkcję mex (np. Abyś nie musiał ponownie uruchamiać programu matlab podczas ponownej kompilacji funkcji mex).
Możesz pójść trochę dalej, jeśli chcesz i ukryć uchwyt za klasą Matlab. Zapoznaj się z funkcjami OO dla Matlaba w dokumentach, jeśli jesteś zainteresowany. Jeśli korzystasz z najnowszej wersji, możesz skorzystać z ich znacznie czystszych obiektów uchwytów.
Dzięki, Panie Fooz. Zaimplementowałem z uchwytem (bezpośrednio jako wskaźnik) i wygląda na to, że działa. To jest dla mnie zaskakujące, że obiekt klasy przydzielony w stercie, nie jest usuwany, gdy funkcja mex zwraca. Czy to normalne zachowanie, na którym mogę polegać w systemie Windows (XP, Vista i 7)? Wielkie dzięki. – Paul
Jeśli przydzielasz obiekty przy użyciu alokatora Matlaba, są one automatycznie usuwane po powrocie z funkcji mex. Jeśli używasz malloc lub new, to Matlab nie wie o nich, a tym samym nie cofa alokacji. –