Main Content

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;

objsetInputObj に渡した場合、MATLAB と setInputObj の両方がメモリを所有し、これは安全でありません。

clib.libname.setInputObj(obj)

メモリの所有権をライブラリに移すには、ライブラリ定義ファイル内の setInputObj の定義を変更します。

%setInputObjDefinition = addFunction(libnameDefinition, ...
%    'setInputObj(ObjClass * obj)', ...
%defineArgument(setInputObjDefinition,'obj','clib.libname.ObjClass',<DIRECTION>,<SHAPE>);

DIRECTIONSHAPE を設定し、引数 ReleaseOnCall を追加します。

defineArgument(setInputObjDefinition,'obj','clib.libname.ObjClass','input',1,'ReleaseOnCall',true);

メモリの所有権を MATLAB に渡す

MATLAB は、ライブラリによって割り当てられたメモリを解放しません。メモリの所有権を MATLAB に移すには、それらの引数で名前と値の引数 DeleteFcn を使用します。

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 関数 deletelibname::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");

参考

| | |