2010-11-26 58 views
1

Im sur la plate-forme unix.qu'en est-il une fuite de mem dans un processus enfant

La mémoire d'un processus avec un memleak est nettoyée à la fin du processus.

Qu'en est-il d'un processus, qui a engendré un enfant, où l'enfant a un memleak. La mémoire filtrée sera-t-elle nettoyée lors de la fermeture de l'enfant? Ou cette mémoire va-t-elle maintenant coller avec le processus parent?

Merci

Répondre

8

La mémoire allouée par le processus enfant existe seulement dans l'espace d'adressage virtuel du processus enfant, pas le parent de. Il sera libéré dès que le processus fils se terminera ou se remplacera par une nouvelle image de programme via l'une des familles de fonctions exec. Cela contraste avec les threads, qui partagent un espace d'adressage virtuel commun, et où les allocations effectuées dans un nouveau thread persisteront après la sortie du thread et resteront utilisables par d'autres threads.

+0

+1 bien que vous devriez mentionner le fait que certains appels comme 'vfork' et' clone' aboutissent à un espace d'adressage partagé. – casablanca

+0

Je n'appellerais pas les résultats de 'vfork' un espace mémoire partagé. 'vfork' a un comportement indéfini si vous appelez autre chose qu'une liste restreinte de fonctions sûres entre' vfork' et '_exit' ou l'une des fonctions de la famille' exec'. Associer 'malloc' à partir de l'enfant' vfork''d risque certainement d'entraîner une corruption de la mémoire. La même chose s'applique généralement à 'clone' avec un espace d'adressage partagé, sauf si vous êtes l'implémenteur de l'implémentation des threads système et avez la liberté d'ajouter les bons mécanismes de synchronisation dans l'implémentation du système' malloc'. –

+0

Et pour mettre en évidence le comportement indéfini, il est complètement autorisé (par les spécifications les plus récentes qui ont 'vfork', IIRC, le POSIX actuel n'a même pas' vfork') pour 'vfork' simplement appeler' fork', donc vous pouvez Ne comptez pas avoir un espace mémoire partagé après 'vfork'. –