2012-03-27 1 views
7

Я собираюсь написать файл Mex, поэтому я могу использовать свой код C++ в MATLAB.C++/MATLAB Mex binding

Этот код построен вокруг одноэлементного класса (в C++).

Я читал, что для постоянной памяти я должен использовать MxAlloc isntead из malloc/new, это правда для всей используемой памяти? I.e, класс I использует векторы, а векторы автоматически выделяют новую память, используя стандартные механизмы.

Так будет ли вектор в классе, выделенном с использованием MxAlloc, иметь проблемы с сохранением его памяти?

+0

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

+0

Спасибо! Переписывание - это именно то, чего я хотел избежать, поскольку библиотека все еще разрабатывается, и это приведет к тому, что у меня будет 2 экземпляра библиотеки, один для работы c/C++ и один для прототипирования MATLAB. –

+0

Помните, что есть еще тонкости, о которых я не совсем уверен. Например, если файл Mex прерван (например, через ошибку), память, выделенная с помощью стандартных методов C *, может * не быть должным образом освобождена ... дальнейший ввод этой точки от людей в курсе будет оценен! –

ответ

7

Вы используете MxAlloc только для данных, которые вы собираетесь возвратить в Matlab. Все, что остается в вашей библиотеке, может быть распределено нормально.

Одна из проблем, о которых вы можете знать, заключается в том, что ваша библиотека может быть выгружена в любое время. Обычно, когда пользователь вызывает вашу mexFunction, библиотека загружается и будет оставаться загруженной для последующих вызовов. Однако в любой момент Matlab может выгрузить вашу библиотеку, и все ресурсы в вашей mexFunction будут освобождены.

+3

При необходимости вы можете использовать mexLock http://www.mathworks.co.uk/help/techdoc/apiref/mexlock.html, чтобы остановить ваш файл mex от выгрузки. – Edric