2009-03-13 2 views
1

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%.

Répondre

3

Si vous n'avez pas besoin de conserver les informations dans le tampon, libérer et allouer un nouveau tampon est la meilleure option. Si ReAlloc doit allouer le tampon dans un emplacement différent, il copiera le contenu existant. En revanche, si vous souhaitez conserver le contenu du tampon et l'étendre (ou le rétrécir), ReAlloc est l'approche la plus simple.

+0

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. –

+0

Merci! Le tampon doit être effacé avant chaque opération. Désolé de ne pas l'avoir indiqué dans ma question initiale. –

+0

@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

Questions connexes