1

J'emballage une classe qui la lecture d'un fichier de données binaires sur mesure et rend les données disponibles à un .net/C# classComment « épingler » des pointeurs C++/CLI

Cependant quelques lignes plus bas le code, je commence à obtenir l'erreur de violation d'accès mémoire qui je crois est due à la GC mémoire se déplacer, la classe est gérée

Voici le code d'appel en C# - lecteur de code mixte (géré des méthodes wrapper sur l'ancien code non géré)

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 ; 
      .... 
     } 
    } 
} 
.... 

Le lecteur a une ancienne instance de classe non gérée nce qui contient les données binaires dans la mémoire et il est un type de pointeur depuis une classe ne peut pas géré maintenir un type non géré

je l'ai regardé interior_ptr, pin_ptr mais ils donnent une c3160 d'erreur ne peut pas être dans une classe gérée

Une solution de contournement? BTW, c'est mon 1er programme C++ depuis très longtemps!

MISE À JOUR: mis à jour le Q, encore une fois ce qui précède est le code d'appel et le lecteur est mélangé (géré + ancien code non géré)

& oui les arguments sont valables

+1

est le lecteur en C++? Le code ci-dessus ressemble plus à C# avec le foreach plutôt que pour chacun. – dkackman

+0

Quel type est 'lecteur'? Est-ce un type géré? Quelle est la valeur de 'colType'? Est-ce une valeur valide? –

+0

Est-ce que le 'foreach' est un mot-clé C# ou utilisez-vous la bibliothèque' boost'?AFAIK, C++ n'a pas de mot clé 'foreach', ce qui signifie que vous n'écrivez pas en C++! –

Répondre

2

Sur la base de la description de votre code "la classe est gérée" ça ne me semble pas que la mémoire soit déplacée. Si reader est une classe gérée et que le consommateur est une classe gérée, toutes ses allocations sont sur le tas géré et n'appellent aucune API non gérée, l'épinglage n'est pas nécessaire.

Cela ressemble plus à votre classe reader est en mode mixte C++ (géré plus code non géré).

Certaines choses à AFFÛT dans ce cas

  • est votre classe C++ allouer un tampon sur le tas d'exécution c et essayer de passe à code managé?
  • Est-ce que votre classe C++ alloue un tampon sur le tas géré et essaie de le passer au code non géré (c'est ici que vous devez épingler)?

et celui qui me cloue tout récemment:

  • Si vous avez non géré le code C++ vous êtes nulle-ment toutes vos allocations de tampon? Un tableau arbitraire d'octets malloc-ed du tas c-runtime n'est pas annulé comme le serait un gcnew array<Byte>(256). (Récemment eu un grand moment DOH après quelques minutes à essayer de comprendre pourquoi free soufflait dans mon visage quand je pensais que pour que le tampon doit être NULL)
Questions connexes