MATLAB での C++ オブジェクトの有効期間の管理
ライブラリがオブジェクトを作成する場合、そのライブラリにはメモリを解放する役割があります。同様に、MATLAB® がオブジェクトを作成する場合、MATLAB がメモリの解放を担当します。ただし、ユーザー ライブラリおよび MATLAB の両方によって割り当てられたメモリが、単一の MATLAB オブジェクトに結合されている可能性があります。MATLAB では、ライブラリ定義ファイル内の引数 ReleaseOnCall および DeleteFcn を指定することにより、ユーザーがオブジェクトの有効期間の管理を制御できます。
メモリの所有権をライブラリに渡す
MATLAB は、コンストラクターを呼び出すことによって割り当てられたメモリを管理します。ユーザー ライブラリがこのメモリを解放してはなりません。この動作を変更するには、defineArgument (ConstructorDefinition)、defineArgument (FunctionDefinition)、または defineArgument (MethodDefinition) に引数 ReleaseOnCall を設定します。
ライブラリ 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)で引数DeleteFcnを使用します。例については、返されるポインターまたは参照に使用するメモリの管理を参照してください。
double 型のポインターのスカラー出力引数の場合、
defineArgument (FunctionDefinition)またはdefineArgument (MethodDefinition)で引数DeleteFcnを使用します。例については、double 型のポインターの入力引数に使用するメモリの管理を参照してください。
deleter 関数にライブラリ関数を指定した場合、その関数はインターフェイスに含められず、ユーザーはその関数を MATLAB から呼び出せません。MATLAB ユーザーは MATLAB 関数 delete を呼び出し、それによって、deleteFcn で指定された関数が呼び出されます。
詳細については、void* 引数および void** 引数のメモリ管理を参照してください。
返されるポインターまたは参照に使用するメモリの管理
この例では、オブジェクトを指すポインターまたは参照を返す関数用のメモリを管理する方法を示します。メモリを解放するメンバー関数 objFree があるとします。
ObjClass *objCreate(int32 a, int32 b);
void objFree(ObjClass *obj);MATLAB がオブジェクト ObjClass を削除するときに objFree を使用するには、ライブラリ定義ファイル内の 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);
double 型のポインターの入力引数に使用するメモリの管理
この例では、スカラー出力として構成された void** 型の入力引数用のメモリを管理する方法を示します。この手順はクラス オブジェクトにも適用されます。パラメーターの型の T** については、ユーザー定義型のデータ マッピングの表を参照してください。
メモリを解放するメンバー関数 clearTask があるとします。
#include <cstdint>
typedef void* handle;
int32_t createTask (const char taskName[], handle *taskHandle);
void clearTask (handle taskHandle); 関数 createTask で作成される void* オブジェクト handle の所有権を MATLAB に渡すには、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)