Я пытаюсь создать mex-файл, который связывает MATLAB с внешней библиотекой C ++, которая связывается с некоторым оборудованием. Импортная библиотека и предварительно скомпилированные библиотеки DLL (.lib и .dll) предоставляются поставщиком оборудования для моей версии VC ++, и я смог реализовать их на C ++ без каких-либо проблем.
Однако я столкнулся с ошибкой сегментации во время выполнения, когда код был написан как mex (скомпилированный с той же версией VC ++). После некоторого исследования с помощью отладчика VC ++ вероятным виновником, по-видимому, является тот факт, что одна из внешних функций dll возвращает тип данных std :: vector и, вероятно, пытается динамически выделить память для векторного контейнера где-то внутри функции. Я знаю, что если я использую std :: vector в своей собственной функции mex, все работает нормально, но я подозреваю, что сам заголовок mex оборачивает контейнер std :: vector в моем собственном коде для управления памятью (?), Как требуется для всех динамически выделил память в мекс-кодах, тогда как он не может сделать то же самое для предварительно скомпилированного .dll.
Теперь возникает вопрос: поскольку я не могу изменить внешний файл .dll и не имею доступа к его исходным файлам, есть ли какие-либо способы работы с этим внешним dll, чтобы динамическая память управлялась MATLAB (возможно, оболочкой какой-то ..?) ... и, таким образом, избежать ошибки сегментации и вернуть правильные данные? Или, если мой анализ неверен, пожалуйста, исправьте меня тоже!
Пожалуйста, дайте мне знать, если есть какие-либо идеи или взломы, спасибо!
Моя система: 32-разрядная версия Windows 7 с пакетом обновления 1 (SP1), MATLAB 2009b, Visual C ++ 2008 Pro.
Я также разместил тот же вопрос по адресу:
http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error
. Вы также можете поделиться своим мнением там, если у вас есть аккаунт, спасибо!