Вызов free()
на одном и том же указателе дважды - классическая ошибка управления памятью, которая приводит к неопределенному поведению (Undefined Behavior, UB). Вот детальный разбор последствий:
int* ptr = malloc(sizeof(int));
free(ptr); // Первый вызов - корректный
free(ptr); // Второй вызов - UB!
При первом free()
:
При втором free()
:
int* ptr1 = malloc(sizeof(int));
int* ptr2 = ptr1;
free(ptr1);
free(ptr2); // То же самое UB!
Методы предотвращения:
free(ptr);
ptr = NULL; // Последующие free(NULL) безопасны
Реализация | Поведение при double-free |
---|---|
glibc (Linux) | Может вызвать abort() |
MSVC CRT (Windows) | Повреждает кучу |
jemalloc | Защитные механизмы |
Для C++:
std::unique_ptr<int> ptr(new int); // Автоматическое освобождение
Для C:
#define SAFE_FREE(p) { free(p); (p) = NULL; }
Резюмируем: двойной вызов free()
- серьезная ошибка, приводящая к неопределенному поведению. Последствия варьируются от немедленного краха до скрытых повреждений памяти. Всегда обнуляйте указатели после освобождения или используйте современные методы управления памятью.