Différence entre free () et la libération

voix
3

Possible en double:
Quelles sont les différences entre libre, dealloc, la libération et autorelease?

Je veux me débarrasser de ma mémoire allouée utilisée dans mon application. Je sais que je dois utiliser , releasemais quelle est la différence entre free()et release? Sont-ils les mêmes?

Créé 09/10/2012 à 13:49
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
4

free()fait partie de la bibliothèque standard C, il est donc une fonction. Il libère immédiatement la mémoire allouée à l' aide obtenue malloc(), il doit donc être passé un pointeur qui est attribué par malloc(), sinon il invoque un comportement non défini.

- releaseest un procédé (par opposition à une fonction) de la NSObjectclasse. Il ne pas immédiatement la mémoire libre; il décrémente que le compteur de référence d'un objet par un. Il vérifie ensuite aussi pour qu'il soit 0 - si elle est égale à zéro, il invoque - dealloc(qui est habituellement remplacée par une sous - classe pour libérer la mémoire allouée par la méthode de constructeur, - initou free()mémoire allouée par malloc()).

Donc , ils ne sont pas la même chose à tous, ne tentez même pas de les utiliser de façon interchangeable!

Créé 09/10/2012 à 13:53
source utilisateur

voix
-1

La partie la plus intéressante est la façon dont fonctionne gratuitement: (et dans ce sens, malloc trop peut être mieux compris)

Dans de nombreux malloc / implémentations libres, libres ne normalement pas revenir la mémoire au système d'exploitation (ou au moins que dans des cas rares). La raison en est, que vous obtiendrez des lacunes dans votre tas et donc il peut arriver que vous avez terminé juste de votre 2 ou 4 Go de mémoire virtuelle avec des lacunes. Cela devrait être évité bien sûr, puisque dès que la mémoire virtuelle est terminée, vous serez en difficulté vraiment grand. L'autre raison est bien sûr, que le système d'exploitation ne peut gérer des morceaux de mémoire qui sont d'une taille spécifique et l'alignement. Pour être précis: Normalement, le système d'exploitation ne peut gérer des blocs que le gestionnaire de mémoire virtuelle peut gérer (le plus souvent des multiples de 512 octets par exemple 4Ko.).

Donc, retour 40 octets au système d'exploitation ne fonctionne tout simplement pas. Alors que fait gratuitement?

Gratuit mettra le bloc de mémoire dans sa propre liste de blocs libres. Normalement, il essaie aussi de se fondre ensemble des blocs adjacents dans l'espace d'adressage. La liste des blocs libres est juste une liste circulaire de morceaux de mémoire qui ont bien sûr des données administratives au début. C'est aussi la raison, pourquoi la gestion des éléments de mémoire très faible avec la norme malloc / libre n'est pas efficace. Chaque morceau de la mémoire a besoin de données supplémentaires et avec de plus petites tailles une plus grande fragmentation se produit.

Le libre-liste est également le premier emplacement, malloc cherche un nouveau morceau de la mémoire en cas de besoin. Il est scanné avant qu'il appelle à une nouvelle mémoire du système d'exploitation. Lorsqu'un morceau est trouvé qui est plus grande que la mémoire nécessaire, il est tout simplement divisé en deux parties. On est retourné à l'appelant, l'autre est remis dans la liste libre.

Release : Cocoa utilise certaines conventions de nommage. Tout ce qui commence par alloc, nouvelle ou copie retourne quelque chose avec un retainCount de 1 et que vous devez à la libération release.When est appelé les reatinCount par 1 décrémente

Créé 09/10/2012 à 14:03
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more