Как “прикрепить” C++ / указатели CLI

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

Однако несколько строк вниз код, я начинаю получать ошибку нарушения доступа к памяти, которой я верю происходит из-за памяти перемещающегося 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 ;
           ....
      }
    }
}
....

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

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

Какое-либо обходное решение? BTW, это - моя 1-я программа C++ в очень долгое время!

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

И да аргументы все допустимы

1
задан Deduplicator 9 March 2015 в 20:55
поделиться

1 ответ

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

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

В этом случае следует обратить внимание на некоторые вещи

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

и тот, который недавно меня пригвоздил:

  • Если у вас есть неуправляемый код C ++, вы обнуляете все свои распределения буфера? Произвольный массив байтов malloc-ed из кучи среды выполнения c не обнуляется, как это было бы с массивом gcnew (256) . (Недавно был большой момент DOH после нескольких минут попыток выяснить, почему free взорвался мне в лицо, когда я был уверен, что буфер должен быть NULL ])
2
ответ дан 2 September 2019 в 23:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: