投稿されたコードには、実際には2つの問題があります。
double* x = (double*)malloc(5 * sizeof(*x));
:
mxArray* p1 = mxCreateDoubleMatrix(5, 1, mxREAL);
mxSetPr(p1, x); /* This leaks memory AND causes a crash */
最初の問題は、他の人がすでに投稿したものです。ネイティブC/C ++メモリ(malloc、calloc、realloc、newなど)をmxArrayに接続することはできません。これを行うと、MATLABメモリマネージャが台無しになり、MATLABがこのメモリを解放しようとすると、最終的にクラッシュが発生します。メモリーはMATLABAPI関数からmxArrayにのみアタッチできます。
2番目の問題は、メモリリークがあることです。mxCreateDoubleMatrix(5、1、mxREAL)呼び出しは、mxArrayのデータポインターの背後にメモリを割り当てます。このデータポインタはガベージコレクションリストにありません。その後mxSetPr(p1、x)を呼び出すと、そのデータポインタを消去してxに置き換えるため、そのデータポインタへの唯一のアクセスが失われ、メモリがリークします。このデータポインタはガベージコレクションリストにないため、mex関数が呼び出し元に戻ったときに解放されません。これは、MATLABを再起動することによってのみ回復できます。クラッシュを引き起こさず、メモリリークを引き起こさずにこれを適切にコーディングするいくつかの方法を次に示します。
元のデータポインタをmxMallocおよびmxFreeに変更します。
double* x = (double*)mxMalloc(5 * sizeof(*x));
:
mxArray* p1 = mxCreateDoubleMatrix(5, 1, mxREAL);
mxFree(mxGetData(p1)); /* Free the original data pointer */
mxSetPr(p1, x); /* Attach MATLAB API generated pointer */
mxMallocに変更し、空行列から始めます。
double* x = (double*)mxMalloc(5 * sizeof(*x));
:
mxArray* p1 = mxCreateDoubleMatrix(0, 0, mxREAL);
mxSetPr(p1, x); /* Attach MATLAB API generated pointer */
mxSetM(p1, 5); /* Set row size */
mxSetN(p1, 1); /* Set column size */
個別に割り当てるのではなく、元のデータポインタを使用してください。
mxArray* p1 = mxCreateDoubleMatrix(5, 1, mxREAL);
double* x = (double*)mxGetData(p1);
/* Then use x downstream in your code */