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

Если библиотека создает объект, ​ затем, библиотека ответственна за выпуск памяти. Аналогично, если 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 не освобождает память выделенный библиотекой. Можно передать владение памяти MATLAB при помощи 'DeleteFcn' аргумент значения имени для этих аргументов:

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

Смотрите также

| | |