202 ___ _____Часть II. Программирование на C++

верке. Инициализируя объект-переменную вызовом конструктора и уничтожая ее деструктором, можно легко выяснить, в нужном ли состоянии она пребывает.

В листинге 9.3 содержится пример того, что можно назвать урезанным потоковым классом. Применение его к ранее рассмотренному примеру — возвращению локальной строки — демонстрирует, насколько коварной является эта разновидность утечки. Иногда такой подход может оказаться единственно возможным способом получения вещественных улик о наличии утечек памяти.

h02021.jpg

/ SLICEIT.CPP — Комбинация нескольких мощных средств. /* В этом примере используется материал, излагаемый в главах

* 14 "Базовые концепции классов; 16 "Перегрузка операций"

* и 19 "Классы-шаблоны". Хотя вам не обязательно знать это все

* для того, чтобы понять конечный результат, но желательно, чтобы

* разобраться в коде.

*/

*include <string.h>

^include <process.h>

ftinclude <iostream.h>

template <unsigned int STRLEN>

class DUMMY_STRING

{

public:

// Конструктор; по умолчанию начальное значение —

// нулевая строка DUMMY_STRING(char *str = "\0") {

if( strlen(str) > STRLEN) abort() ;

else

strcpyf text, str);

}

operator char* () ( return text; } // Оператор-функция // преобразования ttpragma warn -inl

// Блокирует предупреждения компилятора // "for statements no expanded inline" // (операторы for не раскрываются во встраиваемые). // Деструктор инициализирует освобожденные элементы // тестируемым мусором ~DUMMY_STRING() {

// Здесь мы сталкиваемся с проблемой. for( int i = 0; KSTRLEN; i++) text[i] = (char)OxFE;