Сборка мусора (garbage collection) не является встроенной частью языка, как в некоторых других языках программирования (например, Java или C#).
Предоставляет разработчикам полный контроль над управлением памятью. Объекты могут быть созданы на стеке, в динамической памяти или как члены других объектов. Время жизни объектов может быть определено неявно, что затрудняет автоматическое определение, когда объект больше не нужен.
int main() {
int* ptr = new int(42); // Динамическая память
delete ptr; // Явное освобождение памяти
return 0;
}
Позволяет создавать сложные зависимости между объектами через указатели и ссылки. Взаимные ссылки (циклические зависимости) могут запутать сборщик мусора, затрудняя определение, какие объекты являются недостижимыми и могут быть удалены.
class Node {
public:
Node* next;
Node() : next(nullptr) {}
};
int main() {
Node* n1 = new Node();
Node* n2 = new Node();
n1->next = n2;
n2->next = n1; // Циклическая зависимость
delete n1;
delete n2;
return 0;
}
Указатели могут быть не только изменены, но и арифметически обработаны. Это создает дополнительные сложности для сборщика мусора, который должен отслеживать все возможные пути к объектам.
int main() {
int* arr = new int[10];
int* ptr = arr + 5; // Арифметика указателей
delete[] arr;
return 0;
}
Разработан с учетом высокой производительности и низкоуровневого контроля над ресурсами. Автоматическая сборка мусора может вносить непредсказуемые задержки и накладные расходы, что недопустимо для многих системных и реального времени приложений.
Реализация эффективного сборщика мусора требует значительных усилий и усложняет компилятор. Это также может потребовать изменений в существующей библиотеке и кодовой базе, что несовместимо с философией C++ о совместимости и стабильности.
Часто используется в системах, где управление памятью осуществляется на уровне операционной системы или сторонних библиотек. Интеграция автоматического сборщика мусора в такие системы может быть сложной и неэффективной.
Умные указатели (Smart Pointers)
std::unique_ptr: Уникальное владение объектом.
std::shared_ptr: Совместное владение объектом с подсчетом ссылок.
std::weak_ptr: Слабая ссылка, которая не влияет на время жизни объекта.
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> p1 = std::make_shared<int>(42);
std::shared_ptr<int> p2 = p1; // Совместное владение
std::cout << *p1 << " " << *p2 << std::endl; // Вывод: 42 42
return 0;
}
Ставь 👍 и забирай 📚 Базу знаний