Если библиотека создает объект, то за освобождение памяти отвечает библиотека. Аналогично, если 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)
функций.
Если вы задаете функцию библиотеки для функции deleter, то эта функция не входит в интерфейс и пользователи не могут вызвать функцию из MATLAB. Пользователь MATLAB вызывает MATLAB delete
функция, которая вызывает функцию, заданную deleteFcn
.
Предположим, что у вас есть представитель функция 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');
MATLAB delete
вызовы функций libname::objFree
.
myObj = clib.libname.objCreate(x,y) delete(myObj);
defineArgument (FunctionDefinition)
| defineArgument (MethodDefinition)
| defineOutput (FunctionDefinition)
| defineOutput (MethodDefinition)