Глава 6. Базовые типы данных и операции _____________________145

времена программирования в машинных кодах эта тенденция выразилась в трансформации машинного языка в язык ассемблера, в котором место числовых кодов заняли мнемонические инструкции.

Некоторые источники, рассказывая о возникновении языка С, утверждают, что С появился потому, что его создателям надоело программировать на ассемблере. Язык С пошел дальше ассемблера, предоставив разработчикам простые конструкции, заменяющие собой десятки и сотни строк ассемблера. К тому же у программистов появилась возможность из набора инструкций языка создавать комплексные блоки, называемые функциями.

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

Операционная система вашего компьютера предоставляет вашим программам средства, позволяющие запрашивать и освобождать области памяти. В языке С эти средства реализуются двумя функциями, называющимися malloo и free. Функция malloc используется для захвата участка памяти, а free, наоборот, для освобождения.

Функция malloc возвращает указатель пустого типа (void*). Если память выделяется для данных конкретного типа, а не void (как чаще всего и бывает), то приходится приводить тип полученного пустого указателя к требуемому:

char *pchar = (char *)malloc( char);

Приведение типа при каждом выделении памяти вносит в программу беспорядок и становится потенциальным источником ошибок.

С функцией free свои проблемы: освобождение нулевого указателя с ее помощью приводит к неопределенному результату. Операции new и delete были созданы для устранения некоторых недостатков функций malloc и free. Например, вам нет необходимости преобразовывать тип значения, возвращаемого операцией new, благо она корректно работает с любыми типами данных. При неуспешном вызове new возвращает нулевой указатель; а операция delete нулевой указатель обрабатывает правильно. Нет надобности знать в деталях все усовершенствования; просто вместо функций malloc

И free ИСПОЛЬЗуЙТе ОПСраЦИИ new И delete.

Интересно заметить (хотя ничего удивительного в этом нет), что, разобравшись в деталях устройства new и delete, вы обнаружите, что они реализованы с помощью malloc и free. Например, при создании операции (т. е. функции) new как надстройки над malloc его разработчик добавил код для проверки того, что возвращаемое значение имеет правильный тип и для того, чтобы при неудачном вызове malloc вернуть нулевой указатель. Таким