Это очень простой вопрос. Я сформулирую его с помощью C++ и Java, но он не зависит от языка. Рассмотрим хорошо известную проблему в C++:Сбор мусора против ручного управления памятью
struct Obj
{
boost::shared_ptr<Obj> m_field;
};
{
boost::shared_ptr<Obj> obj1(new Obj);
boost::shared_ptr<Obj> obj2(new Obj);
obj1->m_field = obj2;
obj2->m_field = obj1;
}
Это утечка памяти, и все это знают :). Решение также хорошо известно: нужно использовать слабые указатели, чтобы сломать «refcount interlocking». Известно также, что эта проблема не может быть решена автоматически в принципе. Ответственность за ее решение лежит исключительно на программистах.
Но есть положительная вещь: программист имеет полный контроль над значениями пересчета. Я могу приостановить свою программу в отладчике и проверить refcount для obj1, obj2 и понять, что есть проблема. Я также могу установить точку останова в деструкторе объекта и наблюдать момент разрушения (или выяснить, что объект не был уничтожен).
Мой вопрос касается Java, C#, ActionScript и других языков «Сбор мусора». Я мог бы быть что-то не хватает, но на мой взгляд они
- Не дай мне изучить RefCount объектов
- Не дайте мне знать, когда объект будет уничтожен (хорошо, когда объект подвергается GC)
Я часто слышу, что эти языки просто не позволяют программисту утечка памяти, и именно поэтому они великолепны. Насколько я понимаю, они просто скрывают проблемы управления памятью и затрудняют их решение.
Наконец, сами вопросы:
Java:
public class Obj
{
public Obj m_field;
}
{
Obj obj1 = new Obj();
Obj obj2 = new Obj();
obj1.m_field = obj2;
obj2.m_field = obj1;
}
- ли утечка памяти?
- Если да: как его обнаружить и исправить?
- Если нет: зачем?
Это не утечка памяти. Это не защищает ** вас от утечки памяти, но нет ничего, что помешало бы вам освободить эти объекты в деструкторе. Управление памятью является частью ** приложения ** дизайна; низкоуровневые хаки не компенсируют недостаток дизайна. –
не позволяют программисту протечь память не так, но эти langauges могут защитить вас от утечки памяти в большинстве случаев. Это большое преимущество для тех программистов, которые не имеют представления о памяти, мы по крайней мере не нужно слишком беспокоиться об утечке памяти при назначении им некоторых небольших проектов. – StereoMatching
Нет доступа к подсчетам, поскольку большинство реализаций не поддерживают пересчеты, а языки в целом стараются не налагать ограничений на детали реализации, чем это абсолютно необходимо (как это предотвращает лучшие реализации - быстрее, надежнее, удобнее и т. д.). – delnan