Я оборачиваю класс, который чтение пользовательского файла двоичных данных и делает доступными данными к .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, снова вышеупомянутое является кодом вызова, и средство чтения смешано (управляемый + старый неуправляемый код)
И да аргументы все допустимы
Судя по описанию вашего кода «класс управляется» , это не похоже на перемещение памяти. Если reader
является управляемым классом, а потребитель - управляемым классом, все их выделения находятся в управляемой куче, и они не вызывают никаких неуправляемых API-интерфейсов, закрепление не требуется.
Похоже, ваш класс reader
представляет собой смешанный режим C ++ (управляемый плюс неуправляемый код).
В этом случае следует обратить внимание на некоторые вещи
и тот, который недавно меня пригвоздил:
gcnew (256)
. (Недавно был большой момент DOH после нескольких минут попыток выяснить, почему free
взорвался мне в лицо, когда я был уверен, что буфер должен быть NULL
])