Использование CLI C dll с /MDd CRT в собственном c exe с / MTd CRT

#c -cli #msvcrt #crt

#c -cli #msvcrt #crt

Вопрос:

У меня есть собственный c exe-файл, использующий библиотеку времени выполнения / MTd. Я не могу изменить этот параметр, поскольку у меня нет особого контроля над сборкой этого exe. Мне нужно вызвать CLI C dll в этом exe-файле, который возвращает класс с векторными переменными-членами STL. При возврате метода CLI C я получаю ошибку повреждения кучи. Из моего анализа это происходит потому, что есть две разные ЭЛТ, и метод vectors deallocate запущен в собственном ЭЛТ и отключается из-за неверного адреса.

Как мне вернуть вектор из CLI C dll, который скомпилирован с другим CRT, для запуска с моим собственным exe?

Ответ №1:

Ваша оценка верна — распределения, выполненные внутри одного CRT, не могут быть освобождены внутри другого CRT. Это простое правило, и обойти его невозможно.

Вам нужно собрать оба модуля с одинаковыми настройками библиотеки времени выполнения, или вам нужно перенести только POD-типы между границами модуля.

Комментарии:

1. Плохие новости не часто ценятся.

2. Я не собираюсь представлять это в качестве ответа, но если вы были в отчаянии, И класс был возвращен по указателю, а не по значению, И вы были уверены, что вызовете этот метод всего несколько раз во время выполнения программы, ТОГДА вы могли бы просто не удалять класс. Это привело бы к утечке, но, возможно, это приемлемо. Реальный ответ, очевидно, заключается в исправлении конфигурации вашего приложения, как указал @ildjarn. Кроме того, нет гарантии, что операции векторного доступа будут работать на разных CRT в будущем.

3. Спасибо ильджарну и Дэвиду за ваши ответы. Теперь я заменил vector на указатели. Поскольку я знаю размер, я создаю массивы исходных векторных элементов и передаю их через границу dll. Только теперь мне нужно быть ОЧЕНЬ ОСТОРОЖНЫМ, освобождая память только там, где она выделена.