и объект, на который указывает
item1.move(item2->location());
item4 = item3;
item4->move(Point(38, 100));
Объект
item1 и объект, на который указывает
item2, теперь относятся к одной и той же точке экрана. Указатель
item4 стал указывать на тот же объект, что и
item3. Кстати, заметьте разницу между выражениями "объект
item2" и "объект, на который указывает
item2". Второе выражение более точно, хотя для краткости мы часто будем использовать их как синонимы.
Хотя объект
item1 и объект, на который указывает
item2, имеют одинаковое состояние, они остаются разными объектами. Кроме того, мы изменили состояние объекта
*item3, использовав его новое косвенное имя
item4. Эта ситуация, которую мы называем структурной зависимостью, подразумевая под этим ситуацию, когда объект именуется более чем одним способом несколькими синонимичными именами. Структурная зависимость порождает в объектно-ориентированном программировании много проблем. Трудность распознания побочных эффектов при действиях с синонимичными объектами часто приводит к "утечкам памяти", неправильному доступу к памяти, и, хуже того, непрогнозируемому изменению состояния. Например, если мы уничтожим объект через указатель
item3, то значение указателя
item4 окажется бессмысленным; эта ситуация называется повисшей ссылкой. На рис. 3-1в иллюстрируется результат выполнения следующих действий:
item2 = &item1;
item4->move(item2->location());
В первой строке создается синоним:
item2 указывает на тот же объект, что и
item1. Во второй доступ к состоянию
item1 получен через этот новый синоним. К сожалению, при этом произошла утечка памяти, - объект, на который первоначально указывала ссылка
item2, никак не именуется ни прямо, ни косвенно, и его идентичность потеряна. В Smalltalk и CLOS память, отведенная под объекты, будет вновь возвращена системе сборщиком мусора. В языках типа C++ такая память не освобождается, пока не завершится программа, создавшая объект. Такие утечки памяти могут вызвать и просто неудобство, и крупные сбои, особенно, если программа должна непрерывно работать длительное время [Представьте себе утечку памяти в программе управления спутником или сердечным стимулятором.
Содержание Назад Вперед