clear MEX not unloading DLLs in 2016b
이전 댓글 표시
Neither "clear all" or "clear mex" is unloading MEX DLLs. I can verify this by attaching to Matlab in the Visual C++ debugger and looking for DLL "unloading/loading" happening.
This has been asked before, with the following "answer" https://www.mathworks.com/matlabcentral/answers/100577-why-am-i-unable-to-delete-mex-functions-from-memory-using-the-clear-mex-command
It is unclear in this answer what is mean by memory leaks preventing MEX unloading? A MEX function , might have ,for example, have static C++ objects that allocate memory. That will only be de-allocated when the DLL is unloaded.
I remember in a previous version of Matlab , "clear MEX" would force all MEX DLL's to be unloaded.
댓글 수: 2
James Tursa
2018년 8월 1일
Is this only a specific mex dll that you are having problems with?
Andrew Cunningham
2018년 8월 1일
편집: Andrew Cunningham
2018년 8월 1일
답변 (1개)
Philip Borghesani
2018년 8월 2일
편집: Philip Borghesani
2018년 8월 2일
0 개 추천
Clear mex and clear all should still unload mex files that are not in use or locked (see mexLock ). The referenced answer is a bit vague, classic memory leaks will not prevent a mex file from unloading but some resource leaks might.
It is possible for back references or other OS activity to keep a mex file loaded even if MATLAB has attempted to unload it. Sometimes the OS or an antivirus will keep a dll locked for a period of time after MATLAB unloads it.
Check using inmem to see if MATLAB still has it locked. Process Explore (procexp.exe) can find if other applications have a dll locked.
You can also try using m mexAtExit to register an exit function that MATLAB will call before it releases it's last reference to a mex file. If clearing causes your exit function to be hit but the mex file is not unloaded then some other activity is keeping it loaded.
댓글 수: 5
Guillaume
2018년 8월 2일
Thanks for the suggestions but its still unclear why 'clear mex' does not unload my Mex DLL(s) and its dependent DLLs. My MEX files do not call mexLock()
The help for inmem says [...] = inmem('-completenames') returns not only the names of the currently loaded function and MEX-files, but the path and filename extension for each as well. No additional information is returned for loaded classes.
However, inmem('-completenames') does not return any information about my loaded MEX DLLs. It only lists information about Matlab functions. This actually is starting to look like a bug.
Also I am not sure why you would say "other applications have a DLL locked". Multiple applications might load the same DLL, but each application will load the DLL into their own unique process space. Matlab loading/unloading of DLLs happens completely independently from other processes.
Andrew Cunningham
2018년 8월 2일
Andrew Cunningham
2018년 8월 7일
Philip Borghesani
2018년 8월 7일
편집: Philip Borghesani
2018년 8월 7일
I think you missed somthing in the source code. The function stores the count in a matlab global and restores the count from there if cleared. See the if statement after the comment /* Check status of MATLAB and MEX-file MEX-file counter */. Use whos global to see the global and clear all, (or classes or globals) to clear the global.
> mexgetarray
mexgetarray has been called 1 time(s)
>> mexgetarray
mexgetarray has been called 2 time(s)
>> clear classes % clears mex and globals
>> mexgetarray
mexgetarray has been called 1 time(s)
Andrew Cunningham
2018년 8월 7일
카테고리
도움말 센터 및 File Exchange에서 Write C Functions Callable from MATLAB (MEX Files)에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!