#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. Только теперь мне нужно быть ОЧЕНЬ ОСТОРОЖНЫМ, освобождая память только там, где она выделена.