Программа, приведенная в листинге 2.9, тестирует в режиме предельной загрузки памяти класс GCPtr, повторяя размещение и потерю объектов до тех пор, пока не исчерпается свободная память. Когда доступная динамическая память иссякла, операция new генерирует исключение bad_alioc. В обработчике этого исключения явно вызывается функция collect о, возвращающая неиспользуемую память, и процесс продолжается. Вы можете применить этот технический прием и в ваших программах. jpjpraHT 2.9. Тестирование класса GCPtr в режиме предельной загрузки памяти ! // Тестирует в режиме загрузки памяти тип GCPtr, создавая и теряя // тысячи объектов. ¦include <iostream> ¦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 &obj); } ; 11 Создает вставку (inserter) в поток вывода для LoadTest. °stream fcoperator«(ostream &strm, LoadTest &obj) { 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 Length after calling collect(): 1 j^st object: (2590 2590) Length of gclist before calling collectO: 518 Length 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
|