|
Программирование >> Формирование пользовательского контейнера
constructing GCPtr. value at г is: 12 GCPtr going out of scqpe. Before garbage collection for gclist<inc.
After exiting block. Done GCPtr going out of scope. Before garbage collection for gclist<int, 0>: roemPtr refcount value [002F12FO] 0 11 (002F12C0] 1 10 Deleting: 11 After garbage collection for gclist<int, 0>: nenPtr refcount value (002F12C0] 1 10 GCPtr going out of scope- Before garbage collection for gclist<int, 0>: enPtr refcount value t002P12CO] 0 10 dieting: 10 ter garbage collection for gclist<int, 0>: tr refcount value ~ Empty ~ Обсудим подробно приведенные код профаммы и результаты ее выполнения. Прежде всего, отметим, что объекты р и q создаются при запуске main (), а объект г не создается до тех пор, пока не начнет выполняться его блок. Как вы знаете, в языке С++ локальные переменные не создаются до выполнения блока, в котором они объявлены. В момент создания объекта г памяти, на которую он указывает, присваивается начальное значение 12. Это значение выводится на экран, и блок заканчивается. Его завершение вызывает выход объекта г за пределы области видимости, что влечет за собой вызов его деструктора, который уменьшает до нуля счетчик ссылок, хранящийся в списке gclist и связанный с объектом г. Далее вызывается функция collect о для сбора мусора. Поскольку включен режим отображения, после запуска функции collect о на экран выводится содержимое списка gclist. В нем четыре элемента. Первый из них - тот, который прежде был связан с объектом г. Обратите внимание, что его счетчик ссылок (поле refcount) равен нулю, указывая на то, что фрагмент памяти, адрес которого хранится в поле memPtr, больше не используется ни одним профаммным элементом. Следующие 2 элемента еще активны и связаны с объектами q и р соответственно. Так как эти элементы - действующие, память, на которую они указывают, пока еще не освобождается. Последний элемент списка представляет неопределенный или пустой адрес (null pointer), на который ссылались объекты р и q в момент их создания. В данный момент он уже не используется и будет удален из списка функцией collect о (конечно, при этом никакая память не освобождается). Память, ранее связанная с объектом г, очищается, так как нет других объектов типа GCPtr, указывающих на нее, что и подтверждается строкой на экране: Deleting: 12 (уничтожзется 12). После того как это сделано, часть профаммы, расположенная после блока, продолжает выполняться. В конце, когда профамма завершает работу, объекты р и q выходят за пределы области видимости, и память, на которую они указывают, освобождается. В данном случае деструктор объекта q вызывается первым, свидетельствуя о том, что сначала сборщик мусора обрабатывает этот объект. Затем уничтожается объект р и выводится на экран пустой список gclist. Размещенные и потерянные объекты Важно понять, что область памяти становится предметом для сбора мусора, как только ее счетчик ссылок становится равным нулю (это означает, что ни один объект типа GCPtr не указывает на эту область). Совсем необязательно объекту типа GCPtr, который первоначально на нее указывал, выходить за пределы области видимости. Вы можете использовать один объект типа GCPtr для указания на любое число динамически размещенных объектов с помощью последовательных присваиваний ему новых значений. Потерянная 2.4. Размещение и потеря объектов #include <iostream> #include <new> #include gc.h using namespace std; intniainO { try { Распределяет и теряет объекты. GCPtr<int> р = new int(l); p = new int(2); p = new int(3); p = new int(4); Для демонстрационных целей вручную собираются неиспользуемые объекты. GCPtr<int>::collect(); cout *р: *р endl; } catch(bad alloc exc) { cout Allocation failure!\n ; return 1; return 0; ) Далее приведен вывод программы при включенном режиме отображения. Constructing GCPtr. Before garbage collection for gclist<int, 0>: tr refcount value 1002P1310] 1 4 уди забытая память (discarded memory) будет периодически очищаться сборщиком мусора. В листинге 2.4 приведен пример подобного распределения памяти.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |