Если библиотека создает объект, затем, библиотека ответственна за выпуск памяти. Аналогично, если MATLAB® создает объект, затем, MATLAB ответственен за выпуск памяти. Существуют ситуации, однако, где память, выделенная и пользовательской библиотекой и MATLAB, может быть объединена в один объект MATLAB. MATLAB позволяет вам управлять пожизненным управлением объектами путем определения 'ReleaseOnCall'
и 'DeleteFcn'
аргументы в файле определения библиотеки.
MATLAB владеет памятью, которая выделяется путем вызова конструктора. Пользовательская библиотека не должна освобождать эту память. Чтобы изменить это поведение, установите 'ReleaseOnCall'
аргумент в defineArgument (ConstructorDefinition)
, 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'
аргумент значения имени для этих аргументов:
Для функций, возвращающих указатель или ссылку на объект, используйте 'DeleteFcn'
аргумент в defineOutput (FunctionDefinition)
или defineOutput (MethodDefinition)
.
Для примера смотрите, Управляют Памятью о Возвращенном Указателе или Ссылке.
Для двойных скалярных выходных аргументов указателя используйте 'DeleteFcn'
аргумент в defineArgument (FunctionDefinition)
или defineArgument (MethodDefinition)
.
Для примера смотрите, Управляют Памятью о Двойном Входном параметре Указателя.
Если вы задаете библиотечную функцию для функции средства удаления, то эта функция не включена в интерфейс, и пользователи не могут вызвать функцию из MATLAB. Пользователь MATLAB вызывает MATLAB delete
функция, которая вызывает функцию, заданную deleteFcn
.
Для получения дополнительной информации смотрите управление памятью для пустоты* и пусто ** Аргументы.
В этом примере показано, как управлять памятью для функций, возвращающих указатель или ссылку на объект. Предположим, что у вас есть функция членства objFree
это освобождает память.
ObjClass *objCreate(int32 a, int32 b); void objFree(ObjClass *obj);
Использовать objFree
когда MATLAB удаляет объект ObjClass
, измените objCreate
определение в файле определения библиотеки.
%defineOutput(objCreateDefinition,'RetVal','clib.libname.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);
В этом примере показано, как управлять памятью для входного параметра типа void**
сконфигурированный как скалярный выход. Эта процедура применяется к объектам класса также. Смотрите, что параметр вводит T**
в Пользовательской таблице отображения данных Типов.
Предположим, что у вас есть функция членства clearTask
это освобождает память.
#include <cstdint> typedef void* handle; int32_t createTask (const char taskName[], handle *taskHandle); void clearTask (handle taskHandle);
Позволить MATLAB брать владение void*
объект handle
созданный функциональным createTask
, присвойте clearTask
как 'DeleteFcn'
аргумент.
%defineArgument(createTaskDefinition, "taskHandle", "clib.lib.handle", "output", 1);
Добавьте 'DeleteFcn'
аргумент.
defineArgument(createTaskDefinition, "taskHandle", "clib.lib.handle", "output", 1, "DeleteFcn", "clearTask");
defineArgument (FunctionDefinition)
| defineArgument (MethodDefinition)
| defineOutput (MethodDefinition)
| defineOutput (FunctionDefinition)