Что именно происходит при удалении my_object; выполняется? Вся остальная память сдвинута влево на sizeof (MyClass)?

Ради этого вопроса я буду изображать память в виде простого массива байтов, и я буду говорить о памяти кучи, поскольку ее можно динамически распределять.

Допустим, я создаю экземпляр некоторого класса и создаю объект в куче, где часть памяти уже выделена. Затем, после создания объекта, я выделяю больше памяти (возможно, путем создания экземпляра другого класса). Это подразумевает использование new а также delete ключевые слова, конечно.

Память теперь выглядит так:

... byte byte my_object ... my_object byte byte ...

Что именно происходит, когда delete my_object; выполняется? Смещена ли вся остальная память влево sizeof(MyClass)? Если да, то кем? ОС? Что происходит, когда нет ОС для предоставления виртуальной памяти?

5

Решение

Нет, ничего не сдвигается. Вместо этого память получает фрагментированы, Это означает, что у вас теперь есть неиспользуемая дыра в середине используемой памяти. При последующем выделении может быть возможность повторно использовать часть или всю эту память (при условии, что запрошенное количество байтов достаточно мало, чтобы поместиться в отверстие).

Некоторые языки / среды поддерживают сжатие сборщиков мусора. Таким коллекторам разрешено перемещать объекты и, следовательно, они могут устранять дыры, если захотят. Такие подходы сложны в реализации, поскольку сборщик должен знать местоположение каждого указателя в программе. Поэтому коллекторы этого типа больше подходят для языков более высокого уровня.

6

Другие решения

Если бы память была сдвинута, это было бы довольно плохой ОС IMO. Как правило, ОС уведомляется о том, что эта память доступна для повторного использования. Его даже не нужно очищать (и большую часть времени нет). Когда больше памяти не может быть выделено, вы, как правило, получите исключение (если вы используете new) или нулевой указатель назад (если вы используете malloc).

Если фрагментация является проблемой (иногда это так), вам придется написать свой собственный пул памяти Вы можете использовать (существующие) пулы памяти, которые могут справиться с этим, но даже в этом случае большая часть ответственности по-прежнему ложится на программиста.

2

Память не смещена влево. Представь, что случилось бы, если бы это было. Все эти указатели «справа» станут недействительными.

2

В типичной реализации (например, без движущегося сборщика мусора) ничего не будет перемещено.

Bames53 говорит, что Херб Саттер говорит, что в стандарте говорится, что автоматическое перемещение выделенных объектов является незаконным. Спасибо Bames53.

1
По вопросам рекламы [email protected]