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)