Why when I add mxDestroyArray(myArray) to my code MATLAB crashes?
2 次查看(过去 30 天)
显示 更早的评论
Dear All,
I have a problem with using mxDestroyArray. When I add it to my code, MATLAB crashes. Shouldn't I destroy any mxArray that I declared in my code just to avoid memory leak? Shouldn't each mxArray *myArr correspond to a mxDestroyArray(myArr) when the array is no longer needed?
Thanks,
Ahmd
1 个评论
James Tursa
2012-10-24
Please post the offending code (or a small subset of it that reproduces the problem) so we can comment on it.
回答(2 个)
Kaustubha Govind
2012-10-24
You should only call mxDestroyArray on locally created mxArrays that are not being returned in plhs. Are you deleting mxArrays that are present in either prhs or plhs?
2 个评论
Kaustubha Govind
2012-10-25
Okay. In that case, I would second James Tursa's suggestion to post the offending code.
Andrew Stamps
2013-2-15
Does your mxArray happen to contain a Java object? I recently discovered the hard way that calling mxDestroyArray() on an mxArray that contains a Java object will cause a crash, even if you otherwise should call mxDestroyArray().
If you clear the pointer to the Java object before calling mxDestroyArray(), then it doesn't seem to crash, although I don't know if there are other ramifications.
e.g.:
mxSetData(myArr, NULL);
mxDestroyArray(myArr);
2 个评论
James Tursa
2013-2-15
Can you post an example of an mxArray that contains a Java object that causes a crash?
Andrew Stamps
2013-2-16
I encountered this when calling a C shared library generated by the MATLAB Compiler, so maybe this doesn't apply to mex functions as well, but here's a sample function where the error occurs:
static long getNumberOfStreams(const INTEGER instanceHandle)
{
long iLength;
mxArray *numStreams = NULL;
mxArray *streamArray = NULL;
if (!mlfGetStreams(2, &streamArray,
&numStreams, domArray[instanceHandle])) {
return 0;
}
iLength = (long) *(mxGetPr(numStreams));
mxDestroyArray(streamArray); // Why does this cause a crash?
mxDestroyArray(numStreams);
return (iLength > 0) ? iLength : 0L;
}
In its intended use, the input array domArray[instanceHandle] is of class org.apache.xerces.dom.DeferredDocumentImpl and is held in global memory. I am not using the first output argument from the function, streamArray, but it should hold an object of class org.apache.xerces.dom.DeepNodeListImpl. The second output argument is a standard scalar double. If I call mxDestroyArray on streamArray without mxSetData(streamArray, NULL) first, then I get a segmentation fault.
Thanks.
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!