Puis-je utiliser SafeHandle au lieu de IntPtr?

J'ai cherché sur internet et au loin, mais n'ai pas trouvé une bonne explication.

Ma question est assez simple.

J'ai une DLL qui a une fonction appelée Initialiser et l'un des paramètres est un pointeur qui recevra une poignée pour être utilisé avec des appels ultérieurs. Un autre paramètre est une chaîne que je vais pour l'exhaustivité. La signature que j'utilise est (dans sa forme simple):

[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);

De la signature, à la DLL est lui-même écrit que: Initialize(LPTSTR name, HANDLE handle) avec le commentaire "de la POIGNÉE: Pointeur vers un emplacement qui permettra de recevoir la poignée".

Et les appels suivants sont sous la forme de

[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);

J'ai lu sur SafeHandle et je me demandais si je pouvais l'utiliser pour substite pour mon IntPtr poignée. Et si je peux, comment dois-je faire? L'extension de l'abstrait SafeHandle classe n'est pas un problème, mais ce que je peux directement remplacer mon IntPtr pour SafeHandle (et utiliser la valeur par défaut de Triage), ou dois-je faire quelque chose?

Quels sont les avantages d' SafeHandle vous donner juste le stockage de l' IntPtr ne l'est pas?
SafeHandle est IDisposable et s'assure que les ressources visées par la poignée sont libérés. IntPtr est simplement un pointeur de la taille d'une valeur qui ne peut être passée autour d' - il n'a pas l'élimination de la sémantique.
En supposant que vous êtes autorisé à des frais de la mémoire, à moins que vous pouvez affecter le pointeur de la mémoire à l'aide de Marshal.FreeBSTR, Marshal.FreeCoTaskMem, ou Marshal.FreeHGlobal, je ne pense pas que vous pouvez en toute sécurité de-allouer de la mémoire à partir de C#. À l'aide de IntPtr, C# ne pas tenter de libérer la mémoire automatiquement.

OriginalL'auteur Davio | 2012-08-15