Main Content

mxRealloc (C および Fortran)

MATLAB メモリ マネージャーを使用した動的メモリの再割り当て

C 構文

#include "matrix.h"
#include <stdlib.h>
void *mxRealloc(void *ptr, mwSize size);

Fortran 構文

#include "fintrf.h"
mwPointer mxRealloc(ptr, size)
mwPointer ptr
mwSize size

引数

ptr

mxCallocmxMalloc、または mxRealloc によって割り当てられたメモリのブロックへのポインター。

size

割り当てられたメモリの新しいサイズ (バイト単位)。

戻り値

成功した場合は、再割り当てされたメモリのブロックの先頭へのポインター。MAT またはエンジン スタンドアロン アプリケーションで失敗した場合、mxRealloc は、C では NULL (Fortran では 0) を返し、元のメモリ ブロックはそのまま残します (元のメモリ ブロックを解放するには関数 mxFree を使用します)。MEX ファイルで失敗した場合、MEX ファイルは終了し、制御は MATLAB® プロンプトに戻ります。

mxRealloc は、十分な空きヒープ領域がないと失敗します。

説明

mxRealloc は、mxCallocmxMalloc、または mxRealloc で割り当てられているメモリ ブロックのサイズを変更します。MATLAB アプリケーションでメモリを割り当てるには、ANSI® C の関数 realloc ではなく、mxRealloc を使用します。

mxRealloc は、ptr が指しているメモリ ブロックのサイズを size バイトに変更します。再割り当てされたメモリの内容は、新しいサイズまたは古いサイズのどちらか小さい方のサイズに一致するまでは変更されません。再割り当てされたメモリは、元のメモリとは別の場所に配置される場合があります。したがって、返されるポインターは ptr とは異なる可能性があります。メモリの場所が変更された場合、mxRealloc は、ptr が指している元のメモリ ブロックを解放します。

size0 より大きく、ptr が C において NULL (Fortran では 0) の場合、mxReallocmxMalloc のように動作します。mxReallocsize バイトの新しいメモリ ブロックを割り当てて、新しいブロックへのポインターを返します。

size0 であり、ptr が C において NULL (Fortan では 0) ではない場合、mxReallocptr が指しているメモリを解放し、C では NULL (Fortan では 0) を返します。

MAT やエンジン アプリケーション以外の MEX ファイルでは、mxRealloc は割り当てられたメモリを MATLAB メモリ マネージャーに登録します。制御が MATLAB プロンプトに戻ると、メモリ マネージャーはこのメモリを自動的に解放、つまり "割り当て解除" します。

この関数によって作成されるメモリの管理方法は、それに割り当てられるデータの目的によって異なります。mxSetDoubles のような関数を使用してメモリを plhs[] の出力引数に割り当てる場合、MATLAB はメモリを解放しなければなりません。

データを内部で使用する場合、MATLAB メモリ マネージャーは、関数によって割り当てられたすべてのメモリのリストを維持し、制御が MATLAB プロンプトに戻ったときにメモリを自動的に解放 (割り当て解除) します。一般的には、MEX ファイル関数が独自の一時的な配列を破棄し、動的に割り当てられた独自のメモリを解放することを推奨します。自動メカニズムに依存するより、ソース MEX ファイルでこのクリーンアップを実行する方がより効率的です。したがって、この関数によって割り当てられたメモリを使用し終わったら、mxFree を呼び出してメモリの割り当てを解除してください。

このデータを出力引数に割り当てずに、MEX ファイルの終了後にデータを存続させる場合は、この関数の呼び出し後に mexMakeMemoryPersistent を呼び出します。永続的なメモリを使用する MEX ファイルを作成する場合は、MEX ファイルがクリアされたときのために、関数 mexAtExit を登録し、割り当てられたメモリを解放するようにしてください。

matlabroot/extern/examples/mx の次の例を参照してください。

バージョン履歴

R2006a より前に導入