La base de données héritée avec laquelle j'interface utilise un tampon de données pour transmettre des lignes aux applications. Pour gérer cela en C#, j'ai écrit une classe qui fournit des méthodes pour lire et écrire différents types dans le tampon. Chaque fichier de données utilise un tampon de données, mais le tampon doit être redimensionné pour certaines opérations. Pour ce faire, j'ai ajouté une Allouer méthode:Dois-je utiliser ReAllocHGlobal ou FreeHGlobal/AllocHGlobal?
public void Allocate(int bytes) {
if (handle != IntPtr.Zero) { // memory has already been allocated
Marshal.FreeHGlobal(handle);
}
handle = Marshal.AllocHGlobal(bytes);
}
C'était avant que je remarqué ReAllocHGlobal, cependant. Maintenant, je me demande si je devrais faire ceci:
public void Allocate(int bytes) {
if (handle != IntPtr.Zero) { // memory has already been allocated
handle = Marshal.ReAllocHGlobal(handle, (IntPtr)bytes);
} else { // this is a brand new data buffer
handle = Marshal.AllocHGlobal(bytes);
}
}
Je pense que la première méthode semble plus propre, mais qui est le meilleur à utiliser? Ma première pensée était que ReAllocHGlobal a le plus de sens (puisque c'est spécifiquement pour redimensionner un bloc de mémoire existant), mais je ne suis pas sûr à 100%.
Je pense que Free/Alloc est un modèle plus simple à utiliser que ReAlloc. Je n'ai pas eu d'expérience avec ceux-ci, mais je reste loin de CoTaskMemReAlloc() à cause de mauvaises expériences passées. Bien que j'oublie ce qu'ils étaient maintenant. Si vous vous trouvez en train d'allouer et de libérer beaucoup, vous pouvez envisager d'utiliser une arène personnalisée. –
Merci! Le tampon doit être effacé avant chaque opération. Désolé de ne pas l'avoir indiqué dans ma question initiale. –
@jeffamaphone Le problème étant que Free/Alloc est réellement Alloc/Free si vous voulez conserver le contenu, ce qui garantit également une copie, alors que ReAlloc ne le fera que s'il doit réellement déplacer la mémoire. – Zooba