Инструкции
Вещи, которые вам понадобятся
- Владение компилятором C ++
- C ++
- Отладчик и другиеинструменты следственного программного обеспечения
1
Понимание основ оператора.Оператор C ++ «new» выделяет кучу памяти.Оператор «delete» освобождает кучу памяти.Для каждого «нового» вы должны использовать «удалить», чтобы освободить ту же выделенную память:
char* str = new char [30]; // Allocate 30 bytes to house a string.
delete [] str; // Clear those 30 bytes and make str point nowhere.
2
Перераспределять память только в том случае, если вы удалили.В приведенном ниже коде str получает новый адрес со вторым распределением.Первый адрес безвозвратно утерян, как и 30 байтов, на которые он указывал.Теперь их невозможно освободить, и у вас есть утечка памяти:
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
Смотрите эти назначения указателей.Каждая динамическая переменная (выделенная память в куче) должна быть связана с указателем.Когда динамическая переменная отсоединяется от своего указателя (ей), ее становится невозможно стереть.Опять же, это приводит к утечке памяти:
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
Будьте осторожны с местными указателями.Указатель, который вы объявляете в функции, размещается в стеке, но динамическая переменная, на которую он указывает, размещается в куче.Если вы не удалите его, оно будет сохраняться после выхода из функции:
void Leak(int x){
char* p = new char [x];
// delete [] p; // Remove the first comment marking to correct.
}
5
Обратите внимание на квадратные скобки после слова «удалить».Используйте «delete» для освобождения одного объекта.Используйте «delete» [] в квадратных скобках, чтобы освободить массив кучи.Не делайте что-то вроде этого:
char* one = new char;
delete [] one; // Wrong
char* many = new char [30];
delete many; // Wrong!
6
Если утечка еще разрешена - я обычно ищу ее с помощью средства удаления (проверьте здесь: http://deleaker.com).
Спасибо!