|
Программирование >> Формирование пользовательского контейнера
for(int i=0; i < mcltr2 - mcltr; i++) { cout v[i] ; cout \n\n ; Вывод элементов массива в обратном порядке, cout Cycle through array backwards.\n ; for(mcItr = v.endO-l; mcltr >= v.beginO; mcltr-) cout *mcltr ; cout \n\n ; Можно, конечно, использовать нормальный указатель для перемещения в массиве. cout Cycle through array using normal pointer\n ; MyClass *ptr = v; for(int i=0; i < 5; i++) cout *ptr++ ; cout \n\n ; Можно обращаться к элементам массива с помощью GCiterator. cout Access class members through an iterator.\n ; for(mcItr = V.beginO; mcltr != v.endO; mcltr++) { cout mcltr->sum() ; cout \n\n ; Можно размещать и удалять указатель на объект GCPtr обычно, как любой другой указатель, cout Use а pointer to а GCPtr.\n ; GCPtr<int> *pp = new GCPtr<int>(); *pp = new int(100); cout Value at **pp is: **pp; cout \n\n ; Поскольку pp - не указатель для сбора мусора, его следует удалять вручную, delete рр; } catch(bad alloc exc) { Реальное приложение может попытаться освободить память с помощью вызова функции collectO, когда возникнет ошибка при очередном вьщелении памяти, cout Allocation error.\n ; return 0; Далее приводится вывод программы (см. листинг 2.8) с выключенным режимом отображения. value at *ip: 22* inside passGCPtrO : 22 Inside passPtrO : 22 Inside passPtr О : 100 Contents of iap via array indexing. 0 12 3 4 Contents of iap via iterator. 0 12 3 4 Requesting collection on GCPtr<int> list. ob points to (10 20) ob now points to (11 21) Sum is : 32 ob->val: 19.21 Now work with pointers to class objects. Destructing MyClass (0. 0) Destructing MyClass (1, 2) Destructing MyClass (2, 4) Destructing MyClass (3. 6) Destructing MyClass(4, 8) cle through array via array indexing. <° 0) (1 2) (2 4) (3 6) (4 8) cle through array through an iterator. <° 0) (1 2) (2 4) (3 6) (4 8) Cycle through array using a while loop. (0 0) (1 2) (2 4) (3 6) (4 8) mcltr points to an array that is 5 objects long. The difference between mcltr2 and mcltr is 3 Dynamically coirpute length of array. (0 0) (1 2) (2 4) (3 6) (4 8) Cycle through array backwards. (4 8) (3 6) (2 4) (1 2) (0 0) Cycle through array using normal pointer (0 0) (1 2) (2 4) (3 6) (4 8) Access class members through an iterator. 0 3 6 9 12 Use a pointer to a GCPtr. Value at **pp is: 100 Destructing MyClass(4, 8) Destructing MyClass(3, 6) Destructing MyClass(2. 4) Destructing MyClass(1, 2) Destructing MyClass(0, 0) Destructing MyClass{11. 21) Destructing MyClass(10, 20) Самостоятельно попробуйте откомпилировать и выполнить программу с включенным режимом отображения (определите макрос display в файле gc.h). Внимательно просмотрите программу, сопоставляя строку ее вывода с соответствующим оператором. Это поможет вам лучше понять работу сборщика мусора. Помните, что сбор мусора происходит каждый раз, когда объект GCPtr выходит за пределы области видимости. Такой выход возможен в разных точках профаммы, таких, например, как возврат в вызывающую профамму функции, получившей копию объекта GCPtr в качестве параметра-Не забывайте также о том, что каждый тип объекта ccptr поддерживает собственный список gclist. Следовательно, сбор мусора в одном списке не вызывает подобного процесса в списках других типов.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |