exponenta event banner

Управление временем жизни объектов C++ в MATLAB

Если библиотека создает объект, то библиотека отвечает за освобождение памяти. Аналогично, если 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 не освобождает память, выделенную библиотекой. Если функция возвращает указатель или ссылку на объект, можно передать право собственности на память MATLAB с помощью 'DeleteFcn' аргумент в defineOutput (FunctionDefinition) или defineOutput (MethodDefinition) функции.

Если для функции удаления указана библиотечная функция, эта функция не включается в интерфейс, и пользователи не могут вызвать функцию из 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);

См. также

| | |