Очистить неуправляемую память

Всякий раз, когда я использую одну функцию из неуправляемой dll в Usercontrol, я получаю эту ошибку. «System.AccessViolationException: попытка чтения или записи защищенной памяти. Часто это указывает на то, что другая память повреждена». Но это происходит только в том случае, если я использую эту функцию много раз. Но мне нужно использовать эту функцию каждые 3 минуты. Любые идеи высоко ценятся. Спасибо.


person Community    schedule 31.08.2009    source источник
comment
Пожалуйста, опубликуйте код, чтобы ответить на этот вопрос   -  person abhilash    schedule 31.08.2009
comment
Не могли бы вы дать больше информации, выделяет ли эта функция какую-либо память и возвращает указатели, какие данные вы передаете (возможно, вы передаете какую-то строку, которая время от времени имеет значение null, и эта функция не выполняет соответствующие проверки и т. д.)   -  person Marcin Deptuła    schedule 31.08.2009
comment
Скорее всего что-то не так с сортировкой. Проверьте свои объявления, чтобы убедиться, что все имеет правильные атрибуты взаимодействия. И, вероятно, каждый раз что-то портится, но в большинстве случаев вам везет, и искажение портит то, что у вас уже есть. Время от времени вам не везет, и в конечном итоге вы искажаете что-то, что может обнаружить уровень сортировки.   -  person Eric Lippert    schedule 31.08.2009
comment
Вы P/вызываете только одну функцию или также завернули обратный вызов?   -  person R Ubben    schedule 31.08.2009


Ответы (2)


Судя по тому, что вы опубликовали с очень небольшим количеством информации, мой первый внутренний ответ будет заключаться в том, что неуправляемая dll, которую вы используете, если она была написана третьей стороной, имеет внутри нее ошибки обработки памяти. Если это включенная DLL-библиотека Windows, вам нужно больше узнать о том, как вы ее используете, или о ресурсах, которые она использует, поскольку эта ошибка, скорее всего, вызвана вашим кодом, если это DLL-библиотека Windows.

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

person Chris Marisic    schedule 31.08.2009

Управление памятью на Marshalling — сложная вещь. Вы даете очень мало информации, поэтому я могу ответить только в общем:

Маршаллер Interop использует CoTaskMemFree и CoTaskMemAlloc для выделения памяти. Если ваша DLL выделяет память, а .NET должен ее освобождать (или наоборот), то вы должны использовать эти функции. Если память выделяется с помощью new или malloc() и освобождается с помощью delete или free(), библиотека должна предоставить некоторую функцию Cleanup(), чтобы справиться с этим. Чтобы Marshaller не освобождал память, вы должны объявить свои функции с IntPtr как тип данных параметра/возвращаемого значения вместо использования строки или чего-либо еще.

Рассмотрим эти объявления:

   [ DllImport( "Your.dll", CharSet=CharSet.Auto )]
   public static extern string GetSomeString();

   [ DllImport( "Your.dll", CharSet=CharSet.Auto )]
   public static extern IntPtr GetSomeString();

Первая функция должна возвращать строку, выделенную с помощью CoTaskMemAlloc(), и она освобождается .NET Marshaller. Вторая функция может вернуть строку, выделенную malloc или delete, но память не освобождается автоматически. Вы должны вызвать какую-то функцию FreeMemory(IntPtr), которую должна предоставить библиотека.

Не забудьте прочитать: Поведение маршалинга .NET по умолчанию

person Thomas Maierhofer    schedule 31.08.2009