在mex代码中释放内存

时间:2016-07-06 01:52:42

标签: c matlab memory malloc mex

我正在编写一个mex代码,我想我并没有非常有效地使用内存。这就是我的工作。我正在为像

这样的变量分配内存
router.get('/page/module/add/:id', function(req, res) {
    Client.find({"emailAddress": emailAddress, "sequence.slug": pageSlug}, 
{"emailAddress": 1, "sequence.$": 1}, function (err, data) {
        if (!err) {
            res.statusCode = 200;

            buildMod(data);

            return res.json(data);
        } else {
            res.statusCode = 500;

            log.error('Internal error(%d): %s', res.statusCode, err.message);

            return res.json({
                error: 'Server error'
            });
        }
    }).select('sequence emailAddress domain');
});


function buildMod(data) {
    getMod(data);
}

function getMod(data) {
    Module.find({ 'module_id': moduleNumID }, function (err, module) {
        if(!module) {
            return false;
        }

        if (!err) {
            writeMod(data);
        } else {
            return false;
        }
    });

}

function writeMod(data) {
    fs.appendFile(location, content, function(err) {
         if (err) throw err;
         return true;
    });
}

问题是我没有释放我为变量分配的内存,因为如果我这样做,我将收到分段错误,因为我将在Matlab中使用它。所以有人能建议我做一个更好的技术来做上面命令正在做的事情吗?无论如何都要释放内存或避免定义长度为1X N的矩阵

感谢。

1 个答案:

答案 0 :(得分: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)