|
Программирование >> Формирование пользовательского контейнера
инг 2.9. Тестирование класса GCPtr в режиме лредельной загрузки памяти Тестирует в режиме загрузки пс1мяти тип GCPtr, создавая и теряя тысячи объектов. ♦include <iostreanv> ♦include <new> ♦include <limits> ♦include gc.h using namespace std; Простой класс для тестирования типа GCPtr. class LoadTest { int a, b; public: double n[100000]; просто забрать память double val; LoadTestO { a = b = 0; } . LoadTest(int x, int y) { a = x; b = y; val = 0.0; friend ostream &operator (ostream &strm, LoadTest Scdbj); ) ; Создает вставку (inserter) в поток вывода для LoadTest. stream &operator (ostream &strm, LoadTest &obj) { Тест загрузки памяти программа, приведенная в листинге 2.9, тестирует в режиме предельной загрузки памяти класс GCPtr, повторяя размещение и потерю объектов до тех пор, пока не исчерпается свободная память. Когда доступная динамическая память иссякла, операция new генерирует исключение bad alioc. В обработчике этого исключения явно вызывается функция collectO, возвращающая неиспользуемую память, и процесс продолжается. Вы можете применить этот технический прием и в ващих программах. strm ( obj.a obj.b ) ; return strm; int mainO { GCPtr<LoadTest> mp; int i; for(i = 1; i < 20000; i++) { try { mp = new LoadTest(i, i); } catch(bad alloc xa) { Когда генерируется исключение, собирает мусор, вызьшая функцию collectO. cout Last object: *mp endl; cout Length of gclist before calling collectO: mp.gclistSizeO endl; GCPtr<LoadTest>::collect(); cout Length after calling collectO: mp.gclistSizeO endl; return 0; Далее показан фрагмент вывода программы (при выключенном режиме отображения). Конечно, тот вывод, который вы увидите, может отличаться от показанного в этой книге, так как он зависит от объема доступной памяти в вашей системе и компилятора, который вы используете. Last object: (518 518) Length of gclist before calling collectO: 518 Length after calling collectO: 1 Last object: (1036 1036) Length of gclist before calling collectO: 518 Length after calling collectO: 1 Last object: (1554 1554) Length of gclist before calling collectO: 518 Length after calling collectO: 1 Last object: (2072 2072) Length of gclist before calling collectO: 518 jgch after calling collectO: 1 Ist object: (2590 2590) jength of gclist before calling collectO: 518 jgth after calling collectO: 1 Last object: (3108 3108) Length of gclist before calling collectO: 518 Length after calling collectO: 1 Last object: (3626 3626) Length of gclist before calling collectO: 518 Length after calling collectO: 1 Некоторые ограничения Далее перечислены некоторые ограничения использования указателей типа GCPtr. □ Вы не можете создавать глобальные объекты типа GCPtr. Напоминаю, что глобальный объект выходит за пределы области видимости, когда завершается программа. Когда глобальный указатель GCPtr выйдет за пределы области видимости, его деструктор вызовет функцию collect о для очистки неиспользуемой памяти. Возможна проблема, зависящая от реализации вашего компилятора языка С++: список gclist может уже быть удален. В этом случае действия функции collectO вызовут ошибку этапа выполнения Следовательно, указатели типа GCPtr следует применять только для создания локальных объектов. □ Создавая динамически размещенные массивы, вы должны указать размер массива при объявлении указателя GCPtr, ссылающегося на него. К сожалению, нет механизма проверки соблюдения этого требования, поэтому будьте внимательны. О Не следует пытаться освободить память, на которую указывает объект типа GCPtr с помощью явного выполнения операции delete. Если память нужно очистить немедленно, вызовите функцию collect (). О Объект GCPtr должен указывать только на динамически выделенную память с помощью операции new. Присваивание объекту GCPtr указателя, ссылающегося на любую другую память, вызовет ошибку при выходе объекта GCPtr за пределы области видимости, так как будет предпринята попытка освободить память, которая никогда не выделялась. О Лучше избегать циклических ссылок по причинам, описанным ранее в этой главе. Несмотря на то, что вся выделенная память периодически очищается, объекты, содержащие циклические ссылки, остаются размещенными в ней до завершения профаммы, вместо того чтобы удаляться, как только они перестают использоваться профаммными элементами.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |