2016-07-06 3 views
0

Я пишу код mex, и я думаю, что я не использую память очень эффективно. Вот что я делаю. Я выделение памяти для переменной обнаруживаемых какОсвобождение памяти в коде mex

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

plhs[0]=mxCreateDoubleMatrix(1,N,mxREAL); 

set(plhs[0],out); 

Проблема заключается в том, что я не освобождая память, что я выделяю для переменной, потому что если я получу ошибку сегментации, так как я буду использовать его в Matlab. Так может ли кто-нибудь предложить мне лучшую технику делать то, что делают команды выше? Есть ли в любом случае свободная память для выхода или избежать определения матрицы длины 1X N?

Спасибо.

ответ

2

Вам не нужно выделять массив mxMalloc. mxCreateDoubleMatrixуже выделяет массив. Когда у вас есть указатель на эти данные (полученные с помощью mxGetPr), вы можете заполнить массив необходимыми значениями.

double *out; 

// Allocate memory for the first output 
plhs[0] = mxCreateDoubleMatrix(1,N,mxREAL); 

// Get the pointer to the output data 
out = mxGetPr(plhs[0]); 

// Run your algorithm here to populate out with the data you need 

Если по какой-то причине вы сделать необходимости создания out каким-либо иным образом, вы хотите, чтобы скопировать содержимое этого отдельного массива в выходной до освобождения памяти.

double *out; 
double *realout; 

// Allocate data to use internally 
out = mxMalloc(sizeof(double) * N); 

// Initialize the array that will be returned to MATLAB 
plhs[0] = mxCreateDoubleMatrix(1, N, mxREAL); 
realout = mxGetPr(plhs[0]); 

// Now copy all values to the MATLAB output 
for (j = 0; j < N; j++) 
    realout[j] = out[j]; 

// Now you can free up memory for out 
mxFree(out) 
+0

Помните, что мы хотим назначить plhs [0] то, что вы написали, мне кажется, что мы имеем plhs [0 [и вывод указывает на него. в моем случае это вектор данных 1XN, и я пытаюсь присвоить его plhs [0], который является моим выходом matlab. Можете ли вы подробно рассказать о своем ответе, а также можете ли вы рассказать мне, являются ли ваши результаты и мои результаты одинаковыми? – justin

+0

@justin Извините, я имел в виду 'out'. Вы можете выделить 'out' в начале (используя' mxCreateDoubleMatrix', а затем заполнить его в остальной части вашего mex-файла. Нет необходимости выделять его отдельно. – Suever

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