Как закрепить указатели C ++ / CLI - PullRequest
1 голос
/ 09 июня 2010

Я оборачиваю класс, который читает пользовательский двоичный файл данных и делает данные доступными для .net / c # class

Однако, через пару строк кода, я начинаю получать нарушение доступа к памятиошибка, которая, как я полагаю, связана с перемещением памяти GC, класс управляется

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

if ( ! reader.OpenFile(...) )
     return ;
foreach(string fieldName in fields)
{
   int colIndex = reader.GetColIndex( fieldName );
   int colType  = reader.GetColType( colIndex );      // error is raised here on 2nd iteration
}
for ( int r = 0 ; r < reader.NumFields(); r++ )
{
   foreach(string fieldName in fields)
   {
      int colIndex = reader.GetColIndex( fieldName );
      int colType  = reader.GetColType( colIndex );      // error is raised here on   2nd iteration

      switch ( colType )
      {
               case 0 : // INT
               processField( r, fieldName, reader.GetInt(r,colIndex) );
               break ;
           ....
      }
    }
}
....

У Reader есть старая ссылка на экземпляр неуправляемого класса, которая содержит двоичные данные в памяти И это тип указателя, поскольку управляемый класс не может содержать неуправляемый тип

Я посмотрел на interior_ptr,pin_ptr но они выдают ошибку c3160 не может быть в управляемом классе

Есть ли обходной путь?Кстати, это моя первая C ++-программа за очень долгое время!

ОБНОВЛЕНИЕ: обновлено Q, опять же, приведенный выше код вызова и читатель смешаны (управляемый + старый неуправляемый код)

& да все аргументы действительны

1 Ответ

2 голосов
/ 09 июня 2010

На основании описания вашего кода "класс управляется" для меня это не похоже на перемещение памяти.Если reader является управляемым классом, а потребитель является управляемым классом, все их выделения находятся в управляемой куче, и они не вызывают никаких неуправляемых API, закрепление не требуется.

Звучитбольше похоже на то, что ваш класс reader находится в смешанном режиме C ++ (управляемый плюс неуправляемый код).

Некоторые вещи, которые нужно искать в этом случае

  • Ваш класс C ++ выделяет буфер наc куча времени выполнения и пытается передать его в управляемый код?
  • Ваш класс C ++ выделяет буфер в управляемой куче и пытается передать его в неуправляемый код (это то, где вам нужно закрепить)?

и этот, который меня просто прибилнедавно:

  • Если у вас неуправляемый код C ++, обнуляете ли вы все свои буферные выделения?Произвольный массив байтов, malloc-ed из кучи времени выполнения c, не обнуляется, как было бы gcnew array<Byte>(256).(Недавно через несколько минут был большой DOH , пытаясь понять, почему free взорвалось мне в лицо, когда я точно подумал, что буфер должен быть NULL)
...