    34: 	    } 
    35: 	  } 
    36: 	  return(0); // В этом месте будет предупреждение "Unreachable code" 
    37:	} 
    
    В программе MEMERR показано, что необходимо быть особенно осмотрительными 
при обработке ошибок нехватки памяти. В программе в "бесконечном" цикле 
выделяются 2048-байтовые структуры типа q до тех пор, пока оператор new не 
возбудит исключительную ситуацию xalloc. Оператор catch, обрабатывающий эту 
ошибку, вызывает функцию why() (наследованную из класса xmsg) для отображения 
сообщения о возникшей проблеме. 
    Проблема заключается в том, что при истощении ресурсов свободной памяти 
нет никакой гарантии, что сработает оператор вывода в строке 32. 
Действительно, если закончилась свободная память, вы должны быть особенно 
осторожны с операциями ввода-вывода и любыми другими действиями, для 
выполнения которых может потребоваться некоторое количество памяти. В таких 
случаях вызов функции why() и простой вывод строки могут привести к краху 
системы и потере данных. 
    Решение этой проблемы — резервирование небольшого количества памяти в 
начале выполнения программы. В случае возникновения ошибки нехватки памяти 
следует освободить этот резерв, чтобы дать возможность операторам вывода 
получить немного свободной памяти для работы. После этого вы можете завершить 
выполнение программы или, если вы решили продолжить работу, заново 
зарезервировать участок памяти на случай возникновения в будущем проблем с 
выделением свободной памяти. 

    ПРЕДУПРЕЖДЕНИЕ 
    
    Если вы хотите испробоватъ все, о чем говорилось в предыдущем разделе, измените 
размер резервируемой памяти с 512 байт на 1 или 2, скомпилируйте программу заново и 
запустите на выполнение, Модифицированная программа может привести к краху системы с 
сообщением General Protect Fault (GPF) (общее нарушение защиты) и к потере данных. 
Этот эксперимент следует проводить крайне осторожно 


    Динамическая информация о типе 

    Еще одна новинка ANSI C++ — динамическая информация о типе — предназначена 
именно для того, что вы ожидали: для предоставления информации о типе объекта 
во время выполнения программы. Вы можете использовать ее для сравнения типов 
объектов и для доступа к строкам, в которых они описываются 
    ANSI С и ранние версии C++ не имеют средств, эквивалентных динамической 
информации о типе. Раньше для определения размера объекта в байтах вы могли 
использовать sizeof (конечно, у вас и сейчас остается такая возможность), 
однако не существовало никаких стандартных способов определить, принадлежат ли 
объекты одному типу данных или нет. 
    Оператор typeid возвращает объект класса Type_info, который описывает тип 
объекта. Вы можете использовать typeid как для простых объектов встроенных 
типов, подобных int и double, так и для классов, структур, массивов и других 
ваших собственных типов. Вы можете также использовать оператор typeid для 
сравнения типов данных на эквивалентность (равно — не равно) или по алфавиту. 
    Для использования typeid следует включить в программу заголовочный файл 
TYPEINFO.H. Оператор возвращает объекты класса Type_info, в этом классе 
имеются функции-члены, к которым вы можете обратиться. Одна из этих функций, 
name(), предназначается для доступа к имени объекта. Можно использовать ее 
следующим образом: 

    int count; 
    cout « typeid(count).name() « endl; 

    Оператор вывода отобразит int — имя типа данных переменной count. Вы 
можете также сравнить типы данных объектов следующим образом: 

    int i; 
    int j;
    if (typeid(i) == typeid(j)) 
       cout « "i and j are the same types'  « endl; 

    Или же можно использовать оператор != для проверки на неравенство типов данных. 

    if ( typeid( i ) != typeid( j ) ) 
       cout « "i and j are not the same types" « endl, 

    Вы можете также вызвать функцию before() для сравнения типов в алфавитном 
порядке (синтаксис неуклюжий и сомнительного свойства, поэтому легче 
провести лексическое сравнение строк, возвращаемых функцией name() ): 

    if ( typeid(i).before(typeid(d) ) ) 
       cout « "i's type name is lexically before d's type name"; 


    15. Передовые средства С++    419 
