Глава 9. Описатели и спецификаторы данных __________207

Если вы не будете осторожны, то можете непреднамеренно "пробить в памяти брешь". Определив tokenStr как

char tokenStr[128];

и возвратив

return tokenStr; // ОШИБКА: tokenStr при выходе

//из области видимости не определена

мы будем попеременно получать в результате то "мусор", то более или менее осмысленные значения. Это произойдет потому, что указатель стека (stack pointer) после завершения функции не даст впустую пропадать освободившемуся месту (которое только что было занято переменной tokenStr), и к тому времени, когда возвращенное значение будет востребовано, это пространство уже может быть занято какой-то Другой переменной.

Так как по замыслу необходимо возвратить результат в tokenStr, перед вами стоит выбор:

• Переделать функцию так, чтобы char* ей передавался в качестве аргумента

• Сделать переменную tokenStr глобальной

• Сделать переменную tokenStr статической

Плодить глобальные переменные — не самый удачный метод, а вот ключевое слово static обеспечивает идеальное решение. Вот переработанное объявление tokenStr:

// Полезно при ссылке на tokenStr вне .ее области видимости static char tokenStr[128];

Теперь tokenStr не будет автоматически удаляться со стека при выходе за пределы области видимости, а ведь именно поэтому возвращение ссылки на нее было ошибкой.

Метод использования стека для определения переменных просто замечателен: он позволяет снова и снова использовать ограниченный ресурс и не нуждается во внимании со стороны программиста. Так как в 32-разрядных программах размер стека может быть очень велик, то от будущих программ следует ожидать наличие еще большего числа статически размещаемых переменных.

Проблемы утечки

В книге No Bugs! обсуждаются методы, которыми утечки можно заставить себя обнаружить. Пример в листинге 9.3 несколько более сложен, чем материал этой главы. Чтобы справиться с ним, вам, возможно, придется обратиться к главе 14 "Базовые концепции классов".

Не стоит рассчитывать на то, что состояние переменной может быть выяснено в любой момент, но зато точно известные состояния поддаются про-