Gestion de la mémoire avec le marshaleur d'interopérabilité

Mise à jour : novembre 2007

Le marshaleur d'interopérabilité tente toujours de libérer de la mémoire allouée par du code non managé. Ce comportement est conforme aux règles de gestion de la mémoire COM, mais diffère des règles qui régissent le code C++ natif.

Vous risquez de semer la confusion si vous anticipez le comportement du code C++ natif (pas de libération de mémoire) lors de l'utilisation de l'appel de code non managé, qui libère automatiquement de la mémoire pour des pointeurs. Par exemple, l'appel de la méthode non managée suivante à partir d'une DLL C++ ne libère pas automatiquement de la mémoire.

Signature non managée

BSTR MethodOne (BSTR b) {
     return b;
}

Cependant, si vous définissez la méthode comme un prototype d'appel de code non managé, remplacez chaque type BSTR par un type String et appelez MethodOne, le Common Language Runtime tente de libérer b deux fois. Vous pouvez modifier le comportement de marshaling en utilisant des types IntPtr plutôt que des types String.

Le runtime utilise toujours la méthode CoTaskMemFree pour libérer de la mémoire. Si la mémoire que vous utilisez n'a pas été allouée avec la méthode CoTaskMemAlloc, vous devez utiliser un IntPtr et libérer la mémoire manuellement à l'aide de la méthode appropriée. De même, vous pouvez éviter la libération automatique de mémoire dans des situations où la mémoire ne devrait jamais être libérée, comme lorsque la fonction GetCommandLine est utilisée à partir de Kernel32.dll, qui renvoie un pointeur à la mémoire du noyau. Pour plus d'informations sur la libération manuelle de mémoire, consultez Mémoires tampons, exemple.

Voir aussi

Concepts

Attributs directionnels

Types blittables et non blittables

Copie et épinglage

Autres ressources

Comportement de marshaling par défaut