Взаимодействие с собственными библиотеками DLL в C / CLI: есть ли обходной путь для повреждений кучи?

#c -cli #mixed-mode

#c -cli #смешанный режим

Вопрос:

Мне нужно взаимодействовать с собственной сторонней библиотекой, исходного кода которой у меня нет. Я получаю повреждение кучи от простой вещи, подобной этой:

 void MyInterop::DoNastyStuff(String^ foo) {
    ThirdParty::NativeThing x = ThirdParty::NativeThing(msclr::interop::marshal_as<std::wstring>(foo));
    x.doSomething(); // fine
    System::Console::WriteLine("foo"); // fine
} // boom
  

Повреждение кучи происходит, как только метод оставлен (это означает, что я могу поместить столько кода после x.doSomething() , сколько захочу, и все работает нормально).

Когда я создаю сторонний материал в куче, я получаю повреждение кучи при использовании delete команды

 void MyInterop::DoNastyStuffOnHeap(String^ foo) {
    ThirdParty::NativeThing* x = new ThirdParty::NativeThing(msclr::interop::marshal_as<std::wstring>(foo));
    x->doSomething(); // fine
    delete x; // boom
    System::Console::WriteLine("foo"); // fine after clicking Ignore in the dialog that pops up from VS
}
  

Я уже отправил отчет об ошибке третьей стороне, которая предоставляет мне DLL, но есть ли какое-либо обходное решение для этого?

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

1. Каков фактический источник повреждения? Используйте отладчик, чтобы выяснить. Является ли это деструктором NativeThing (похоже, из вашего кода)? Если это так, единственное, что вы можете сделать, это исправить это или не вызывать его, т. Е. Выделить с помощью new и не вызывать delete, что похоже на худший совет из когда-либо существовавших и приводит к утечке памяти и / или ресурсов.

2. Что за ошибка? Что является исключением или кодом ошибки WIN32?

3. Альтернативами здесь может быть изоляция кода с ошибками для его собственного процесса… Это может быть сложно, но если ошибка исправляется поставщиком, и вы довольны временной утечкой памяти, и предполагаете, что ошибка изолирована от содержимого этого выделения, рассмотрите возможность не удалять собственный объект… это много но… Лучше всего быстрее исправить это у поставщика.

4. Я получаю сообщение о повреждении кучи CRT detected that the application wrote to memory after end of heap buffer . Когда я нажимаю на Retry , мой сеанс отладки зависает.

5. Я могу поместить неприятный материал в отдельный exe-файл, который я могу вызвать из своего основного приложения с помощью Process.Start , и тогда отдельная программа не выпустит объект с ошибкой, поскольку он выполняет только одну задачу и завершает работу.