770________________•_______________Часть II. Программирование на C++
Здесь массив farray не удалили, да еще и потеряли указатель на него. Это значит, что освободить занимаемую им память невозможно, поскольку после потери указателя нет никакого способа сослаться на нее. Это еще один пример возникновения утечек памяти. Еще раз, пока вы не будете железно уверены в том, что вы делаете, постарайтесь избегать возвращения указателей на локальные переменные.
Исключение ИЗ Правил: Static. Если вам нужно, чтобы локальная переменная сохраняла свое значение между вызовами функций, то тогда ключевое слово static — это то, что вам нужно. Использование этого ключевого слова заставляет компилятор принять меры для запоминания переменной даже после выхода из функции.
При этом память под статическую локальную переменную выделяется в глобальном пространстве. Хотя для функции такая переменная работает как локальная, хранится она не в стеке. В результате ее значение не теряется между вызовами функции. Вот фрагмент, демонстрирующий этот прием на примере символьного массива:
char *ReturnCharP() (
static char buf [128];
cin.getlinef buf, 128); // читать до возврата каретки или до
// 127 байта; последний байт — для '\0'
return buf;
}
Вероятно, имеет смысл как-то сохранить или использовать полученное значение, поскольку, хотя локальная переменная даже и объявлена как static, следующий вызов функции, скорее всего, перепишет ее содержимое. Этот метод просто позволяет быть уверенным в том, что содержимое переменной не будет утрачено и функция возвратит осмысленное значение.
Понимание указателей
Указатель — это имя, с помощью которого можно ссылаться на некоторое место в памяти. Это может быть память, выделенная под переменную с помощью new, это может быть статический блок памяти, может быть конкретный физический адрес. Сам указатель не занимает никакого места, кроме того что нужно для хранящегося в нем адреса.
Значение адреса указателя определяет, на что он указывает, а то, на что он указывает, как раз и занимает место в памяти. Важно ясно понимать взаимосвязь между указателями и адресуемыми объектами, поскольку неверное использование указателей — это неисчерпаемый источник ошибок. По этой причине многие языки и инструменты разработки приложений избегают использования указателей. Хотя они могут даже допускать манипуляции с