2016-07-04 3 views
0

У меня есть некоторые вопросы о mxMalloc и mxFree для выделения памяти в mex-коде. Предположим, я уверен, преобразование кода C в Matlab, и я выделить память, как это:Когда освободить выделенную память в файле mex

in= mxMalloc(sizeof(double)*N); 

in =mxGetPr(prhs[0]); 

Однако когда позже я освободить память с помощью

mxFree(in) 

Я получаю ошибку нарушения сегментации. Интересно, может ли кто-нибудь объяснить, когда я должен понять, что я должен освободить и выделить память. какой тип указателей должен быть освобожден и какой тип не должен быть освобожден?

ответ

0

Здесь есть несколько проблем. Прежде всего вы выделяете память и указатель in указывают на это свежие данные.

in = mxMalloc(sizeof(double)*N); 

Это совершенно не нужно, так как вы тогда отказаться от этой информации, и вместо того, чтобы иметь указатель in точку на один из входов , что MATLAB предоставляет вашей функции.

in = mxGetPr(prhs[0]); 

in теперь ссылается на данные, которые MATLAB предоставил вашей функции и MATLAB ожидает эти данные, чтобы остаться там. Если вы вызываете mxFree, чтобы освободить его, MATLAB не сможет получить доступ к этим данным при попытке получить к нему доступ позже, что приведет к ошибке нарушения сегментации.

Если вы не переназначили in, чтобы указать на входные данные, вы можете использовать mxFree, чтобы освободить его, только если вы не планируете передавать указатель на эти данные обратно в MATLAB.

in = mxMalloc(sizeof(double) * N); 
mxFree(in); 
+0

я действительно присвоить свой ответ, но что, если я не передавая данные назад я прочитал в других документах, что память, выделенная mxMalloc будет автоматически освобождена, когда программа ends.can пожалуйста подробнее остановиться на этом? – justin

+0

@justin, пожалуйста, посмотрите мое обновление. – Suever

+0

Большое вам спасибо. Мне было интересно, указывая на вход Matlab, и мой вывод от mex к Matlab - это что-то еще. Итак, почему это должно быть проблемой для освобождения, потому что я манипулирую внутри и в конце программы, я освобожусь после того, как Matlab передаст вход и выполнит все вычисления, затем наберите mxFree (in). – justin

Смежные вопросы