2010-01-31 6 views
0

Я пишу некоторый собственный код на C++, который нужно вызывать из C# (и я не могу заменить собственный код C++ кодом C#).Распределители памяти для родной библиотеки C++, которые будут использоваться C#

Я обнаружил повреждения памяти при распределении/освобождении некоторой памяти в собственном C++-коде, используя malloc/free. Затем я использовал LocalAlloc/LocalFree и HeapAlloc/HeapFree и имел те же проблемы.

Выделения/освобождения от ответственности кажутся правильными, и они происходят в отдельном потоке, созданном нативным кодом.

мне было интересно, что является лучшей стратегией распределения для использования в родной C++ библиотеки наречено C#

EDIT: нашел проблема: проблема не в коде выделения/открепления, но в некоторых память записывается после освобождения.

ответ

1

До тех пор, пока на стороне C# кода используется коммутатор /unsafe компилятора и ключевое слово fixed, используемое для хранения буфера данных , Я думаю, вы должны быть в порядке.

Что касается вопроса о распределении памяти, это может быть не код выделения памяти C++, который вызывает проблему, это может быть способ взаимодействия кода C++ с драйвером ... возможно, используя VirtualAlloc/VirtualFree пара в соответствии с MSDN документов ...

Edit: при попытке выделить буфер для хранения данных из стороны C++ после взаимодействия с водителем ... возможно гонками условием или прерыванием вызывает задержку повреждение памяти ... просто мысль ...

Надеюсь, это поможет, С уважением, Том.

+0

Нет, драйвер не выделяет память. Я отредактирую вопрос, потому что проблема не имеет ничего общего с самим драйвером. –

+0

@ Enrico: ahh ... извините ... я отредактирую свой ответ соответственно .... – t0mm13b

+0

@ Enrico: Я отредактировал свой ответ ... Надеюсь, что это пролить свет на это ... – t0mm13b

-1

Рекомендуемый драйвер для разработки драйверов Windows рекомендуется для использования с драйверами C++.

Также лучшая стратегия заключается в том, чтобы водитель управлял собственной памятью. Когда C# нужно увидеть данные, передайте им буфер с маршаллированием и попросите его заполнить его.

+1

Вопрос не о драйвере, а о библиотеке C++, которая взаимодействует с драйвером (это единственная причина, по которой я написал собственную C++-библиотеку вместо написания кода на C#). Кроме того, драйвер - это USB-драйвер пользовательского режима, где использование C++ в примерах DDK. –

1

Ваш вопрос не содержит существенных деталей, совсем не ясно, должна ли освобождаться память, выделенная кодом C++, на стороне C#. Обычно это делается автоматически, например, с помощью маршаллера P/Invoke или уровня взаимодействия COM в среде CLR. Или можно сделать вручную, объявив аргумент метода как IntPtr, а затем использовать класс маршала.

Если это делается автоматически, вы должны использовать распределитель памяти COM, CoTaskMemAlloc(). Если вы маршалируете себя, вы также можете использовать GlobalAlloc(), выпустить на стороне C# с помощью Marshal.FreeHGlobal(). Нет никакого преимущества в использовании GlobalAlloc(), вы также можете использовать CoTaskMemAlloc() и выпускать с помощью Marshal.FreeCoTaskMem().

Но вы должны были это заметить сами. Выделение с помощью malloc() или HeapAlloc() на стороне C++ вызывает утечку вместо повреждения, если управляемый код освобождает память. У Vista и Win7 есть намного более строгий менеджер кучи, он завершает программу, если она замечает неудачную версию.

Мне кажется, что у вас есть простое кучевое повреждение в коде на C++. Это самый распространенный бич неуправляемого программирования на С ++, превышение конца буфера, запись в освобожденную память, неправильные значения указателя.Способ избавиться от таких ошибок - это тщательный обзор кода и использование распределителя отладки, такого как тот, который предоставляется <crtdbg.h>. Удачи вам.

+0

Справа: на самом деле это было повреждение кучи из-за памяти, записанной после освобождения. –

Смежные вопросы