Instructions
Les choses dont Vous aurez Besoin
- La compétence en C++
- Compilateur C++
- Débogueur et d'autres outils logiciels d'enquête
1
Comprendre les notions de base de l'opérateur. L'opérateur C++ "nouvelle" alloue de la mémoire de masse. La "suppression" de l'opérateur libère la mémoire du tas. Pour chaque "nouveau", vous devez utiliser un "supprimer" afin de libérer la mémoire alloué:
char* str = new char [30]; // Allocate 30 bytes to house a string.
delete [] str; // Clear those 30 bytes and make str point nowhere.
2
Réallouer la mémoire que si vous avez supprimé. Dans le code ci-dessous, str acquiert une nouvelle adresse avec la deuxième allocation. La première adresse est irrémédiablement perdu, et sont donc les 30 octets qu'il souligné. Maintenant, ils sont impossibles à free, et vous avez une fuite de mémoire:
char* str = new char [30]; // Give str a memory address.
// delete [] str; // Remove the first comment marking in this line to correct.
str = new char [60]; /* Give str another memory address with
the first one gone forever.*/
delete [] str; // This deletes the 60 bytes, not just the first 30.
3
Regarder ces pointeur de missions. Chaque variable dynamique (mémoire allouée sur le tas) doit être associé à un pointeur. Lorsqu'une variable dynamique devient dissocié de son pointeur(s), il devient impossible à effacer. De nouveau, ce qui entraîne une fuite de mémoire:
char* str1 = new char [30];
char* str2 = new char [40];
strcpy(str1, "Memory leak");
str2 = str1; // Bad! Now the 40 bytes are impossible to free.
delete [] str2; // This deletes the 30 bytes.
delete [] str1; // Possible access violation. What a disaster!
4
Soyez prudent avec les pointeurs locaux. Un pointeur de vous déclarer, dans une fonction est alloué sur la pile, mais la dynamique de la variable, il est alloué sur le tas. Si vous ne la supprimez pas, elle persiste après les sorties de programme à partir de la fonction:
void Leak(int x){
char* p = new char [x];
// delete [] p; // Remove the first comment marking to correct.
}
5
Attention à la place des accolades après "supprimer". Utilisation "supprimer" par lui-même afin de libérer un objet unique. Utilisation "supprimer" [] avec des crochets pour gratuit un tas de tableau. Ne pas faire quelque chose comme ceci:
char* one = new char;
delete [] one; // Wrong
char* many = new char [30];
delete many; // Wrong!
6
Si la fuite encore admis - je suis habituellement recherchant avec deleaker (vérifier ici: http://deleaker.com).
Merci!