clear MEX not unloading DLLs in 2016b
11 次查看(过去 30 天)
显示 更早的评论
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 个评论
回答(1 个)
Philip Borghesani
2018-8-2
编辑:Philip Borghesani
2018-8-2
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 个评论
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)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!