Je travaille avec du code non managé C # et C ++ et il y a deux choses que je ne comprends pas quand je traite de la mémoire. Si quelqu'un peut m'aider à comprendre:

  1. Si une variable est allouée dynamiquement sous C # (en utilisant new), puis est passée au code non managé C ++. Cette mémoire variable doit-elle être désallouée manuellement sous le code non managé C ++ par l'utilisateur?

  2. Si une variable est allouée dynamiquement sous C ++ non managée (en utilisant new) puis transmise à C #, est-il prudent de dire que le garbage collector va désallouer cette mémoire?

3
Adrian 27 juil. 2017 à 13:57

2 réponses

En règle générale, celui qui component / object alloue de la mémoire doit la désallouer. Pour chaque new a delete par celui qui a fait new.

C'est l'idéal. S'il n'est pas suivi pour des raisons telles que votre C++ programme peut se terminer et ne pas exister lorsque le cycle de vie de la mémoire allouée arrive à sa fin, votre C# devrait nettoyer et vice versa.

1
Griffin 27 juil. 2017 à 11:03
  1. Non, puisque l'objet est alloué sur le tas géré, GC gérera la désallocation comme d'habitude. Le problème est que vous devez lui dire de ne pas désallouer ou de ne pas modifier l'adresse de l'objet lorsqu'il est utilisé à partir de code non géré car GC ne peut pas savoir combien de temps vous allez utiliser l'objet à partir du code non géré. Cela peut être fait en épinglant l'objet. Voir la réponse à ce question.

  2. Non, puisque l'objet est alloué sur le tas non managé C ++ GC ne le touchera pas. Vous devez le désallouer vous-même à l'aide de delete.

Éditer: Si vous avez besoin d'allouer un objet dans du code managé et de le désallouer dans du code non managé ou vice versa, il est bon de savoir qu'il existe un tas de système d'exploitation à cet effet que vous pouvez utiliser via Marshal.AllocHGlobal et Marshal.FreeHGlobal appelle à partir de C #, il y aura des appels similaires en C ++.

3
Tom 27 juil. 2017 à 11:49