Здравствуйте, Посторонним В., Вы писали:
ПВ>Здравствуйте, Awaken, Вы писали:
A>>надо для собеседования
A>>-почему в С++ нельзя реализовать полноценный сборщик мусора?
ПВ>Хотелось бы услашать ответ на этот вопрос.
ПВ>С технологией GC не знаком, но на ум приходят кольцевые ссылки и наличие в C++ деструкторов.
Имхо, это не составляет проблем, основные засады — наличие арифметики с указателями (они же хендлы объекты) и нетипибезопасность.
Например, законный (ну если и не законный, то так скажем... возможно используемый... в том или ином виде) пример:
char* p = 0;
void alloc()
{
char* l = (char*)malloc(100);
p = l + 200;
}
void use()
{
char* l = p - 200;
// ...
}
Или что-то типа такого:
A* a = 0;
B* b = 0;
void alloc()
{
char* p = (char*)malloc(100);
a = new (p + 10) A();
b = new (p + 60) B();
}
В языках со встроенной сборкой мусора нет адресной арифметики, нет inner pointer (указателей "внутрь" объекта). Если объектные хендлы — есть чётко типизированные хендлы "на начало" объекта.
В этом смысле cli::inner_ptr из c++/cli создаёт определённые трудности, но там ввели дополнительные ограничения и требования.