Если библиотека создает объект, затем, библиотека ответственна за выпуск памяти. Аналогично, если MATLAB® создает объект, затем, MATLAB ответственен за выпуск памяти. Существуют ситуации, однако, где память, выделенная и пользовательской библиотекой и MATLAB, может быть объединена в один объект MATLAB. MATLAB позволяет вам управлять пожизненным управлением объектами путем определения 'ReleaseOnCall' и 'DeleteFcn' аргументы в файле определения библиотеки.
MATLAB владеет памятью, которая выделяется путем вызова конструктора. Пользовательская библиотека не должна освобождать эту память. Чтобы изменить это поведение, установите 'ReleaseOnCall' аргумент в defineArgument (FunctionDefinition) или defineArgument (MethodDefinition).
Предположим, что у вас есть функция в библиотеке libname который берет владение входного параметра.
void setInputObj(ObjClass *obj);
Если вы создаете аргумент в MATLAB, то MATLAB владеет памятью.
obj = clib.libname.ObjClass;
Если вы передаете obj к setInputObj, затем и MATLAB и setInputObj владейте памятью, которая небезопасна.
clib.libname.setInputObj(obj)
Чтобы передать владение памяти библиотеке, измените setInputObj определение в файле определения библиотеки.
%setInputObjDefinition = addFunction(libnameDefinition, ... % 'setInputObj(ObjClass * obj)', ... %defineArgument(setInputObjDefinition,'obj','clib.libname.ObjClass',<DIRECTION>,<SHAPE>);
Установите DIRECTION и SHAPE и добавьте 'ReleaseOnCall' аргумент.
defineArgument(setInputObjDefinition,'obj','clib.libname.ObjClass','input',1,'ReleaseOnCall',true);
MATLAB не освобождает память выделенный библиотекой. Если функция возвращает указатель или ссылку на объект, можно передать владение памяти MATLAB с помощью 'DeleteFcn' аргумент в defineOutput (FunctionDefinition) или defineOutput (MethodDefinition) функции.
Предположим, что у вас есть функция членства objFree это освобождает память.
ObjClass *objCreate(int32 a, int32 b); void objFree(ObjClass *obj);
Использовать objFree когда MATLAB удалит объект, измените objCreate определение в файле определения библиотеки.
%defineOutput(objCreateDefinition,'RetVal','clib.lbiname.ObjClass,<SHAPE>);Установите SHAPE и добавьте 'DeleteFcn' аргумент.
defineOutput(objCreateDefinition,'RetVal','clib.libname.ObjClass,1,'DeleteFcn','libname::objFree');
delete MATLAB вызовы функции libname::objFree.
myObj = clib.libname.objCreate(x,y) delete(myObj);
defineArgument (FunctionDefinition) | defineArgument (MethodDefinition) | defineOutput (FunctionDefinition) | defineOutput (MethodDefinition)