Главная arrow С++ (часть 3) arrow Тест загрузки памяти

Тест загрузки памяти

Программа, приведенная в листинге 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