1

mexルーチンに次のコードがあると仮定して、ねえ。

mxArray *newPoint = mxDuplicateArray(prhs[0]);
double *newPointData = mxGetPr(newPoint);
newPoint = mxDuplicateArray(prhs[1]);

新しいmxArrayを指すようにnewPointDataも再度更新する必要がありますか?そして、最初の出現がnewPoint指し示す記憶はどうですか?経由してそれを破棄する必要があるmxDestroyArray(newPoint);のでしょうか。そうしないと、再割り当て後にアドレスが失われるためnewPointです。

ありがとう!

編集:メモリ割り当ての問題をよりよく理解するために、これをバンプしてください!?

4

2 に答える 2

2

mxDuplicateArray新しい配列を割り当て、データをコピーします。新しく複製された各配列のデータは、異なるメモリ領域に格納されます。

したがって、はい、をmxGetPr()呼び出すたびにデータのアドレスを取得するためにを使用する必要がありますmxDuplicateArray()

そして当然、割り当てられたアレイは割り当てを解除する必要があります。そのためには、作成された各mxArrayへの元のポインター(によって返されるもの)を保持する必要がありますmxDuplicateArray

最後に、(mxGetPrを使用して)データのアドレスを取得した後、を破棄することはできません。mxArrayそれ以外の場合は、割り当てが解除され、別の目的で他のコードによって再度割り当てられる可能性のあるメモリにアクセスしています。

于 2011-05-25T10:13:08.347 に答える
1

mxDuplicateArray場合によっては、ディープコピーが実行されないことに 注意してください:http: //jp.mathworks.com/matlabcentral/newsreader/view_thread/310346

バグは修正されておらず、関数に関するドキュメントはまだ間違っています。

于 2014-11-19T06:47:49.377 に答える