202 ___ _____Часть II. Программирование на C++
верке. Инициализируя объект-переменную вызовом конструктора и уничтожая ее деструктором, можно легко выяснить, в нужном ли состоянии она пребывает.
В листинге 9.3 содержится пример того, что можно назвать урезанным потоковым классом. Применение его к ранее рассмотренному примеру — возвращению локальной строки — демонстрирует, насколько коварной является эта разновидность утечки. Иногда такой подход может оказаться единственно возможным способом получения вещественных улик о наличии утечек памяти.
/ 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;