Вопрос по памяти MATLAB для mex-файлов - PullRequest
1 голос
/ 17 мая 2011

Привет, при условии, что у меня есть следующий код в mex-подпрограмме:

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

Должен ли я еще раз обновить newPointData, чтобы он указывал на новый mxArray? А как насчет памяти, на которую указывает первое вхождение newPoint? Нужно ли мне также уничтожить это через mxDestroyArray(newPoint);, потому что, если я этого не сделаю, я потеряю адрес после повторного присвоения newPoint.

Спасибо!

Редактировать: Ударьте по этому, пожалуйста, для лучшего понимания проблемы выделения памяти!?

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

mxDuplicateArray выделяет новый массив и копирует данные.Каждый новый дублированный массив хранит свои данные в отдельной области памяти.

Итак, да, вы должны использовать mxGetPr(), чтобы получать адрес данных после каждого вызова mxDuplicateArray().

И, естественно, выделенные массивы должны быть освобождены.Для этого вам нужно сохранить исходный указатель на каждый созданный mxArray (возвращаемый mxDuplicateArray).

Наконец, вы не можете уничтожить mxArray после получения адресаданные (используя mxGetPr).В противном случае вы обращаетесь к памяти, которая была освобождена и может быть снова выделена другим кодом для другой цели.

1 голос
/ 19 ноября 2014

Имейте в виду, что mxDuplicateArray не делает глубокое копирование в некоторых случаях: http://jp.mathworks.com/matlabcentral/newsreader/view_thread/310346

Ошибка не исправлена, и документация по функции по-прежнему неверна.

...