Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Самоучитель С++ - Шилдт Г.

Шилдт Г. Самоучитель С++ — Спб.: БВХ-Петербург, 2003. — 688 c.
ISBN 5-7791-0086-1
Скачать (прямая ссылка): samouchitelc2003.djvu
Предыдущая << 1 .. 31 32 33 34 35 36 < 37 > 38 39 40 41 42 43 .. 206 >> Следующая

Когда C++ только появился, при невозможности удовлетворить запрос на выделение памяти оператор new возвращал нулевой указатель. В дальнейшем эта ситуация изменилась, и при неудачной попытке выделения памяти оператор new стал генерировать исключительную ситуацию. В конце концов было принято решение, что при неудачной попытке выделения памяти оператор new будет генерировать исключительную ситуацию по умолчанию, а возвращение нулевого указателя останется в качестве возможной опции. Таким образом, реализация оператора new оказалась разной у разных производителей компиляторов. К примеру, во время написания этой книги в компиляторе Microsoft Visual C++ при невозможности удовлетворить запрос на выделение памяти оператор new возвращал нулевой указатель, а в компиляторе Borland C++ генерировал исключительную ситуацию. Хотя в буду-
Гпава 4. Массивы, указатели и ссылки_
119
щем во всех компиляторах оператор new будет реализован в соответствии со стандартом Standait C++, в настоящее время единственным способом узнать, какие именно действия он выполняет при неудачной попытке выделить память, является чтение документации на компилятор.
Поскольку имеется два возможных способа, которыми оператор new может сигнализировать об ошибке выделения памяти, и поскольку в разных компиляторах он может быть реализован по-разному, в примерах программ этой книги сделана попытка удовлетворить оба требования. Во всех примерах значение возвращаемого оператором new указателя проверяется на равенство нулю. Такое значение указателя обрабатывается теми компиляторами, в которых при неудачной попытке выделить память оператор new возвращает нуль, хотя никак не влияет на те, в которых оператор new генерирует исключительную ситуацию. Если в вашем компиляторе во время выполнения программы при неудачной попытке выделить память оператор new сгенерирует исключительную ситуацию, то такая программа просто завершится. В дальнейшем, когда вы ближе познакомитесь с обработкой исключительных ситуаций, мы вернемся к оператору new, и вы узнаете, как лучше обрабатывать неудачные попытки выделения памяти. Вы также узнаете об альтернативной форме оператора new, который при наличии ошибки всегда возвращает нулевой указатель.
И последнее замечание: ни один из примеров программ этой книги не должен вести к ошибке выделения памяти при выполнении оператора new, поскольку в каждой конкретной программе выделяется лишь считанное число байтов.
Хотя операторы new и delete выполняют сходные с функциями malloc() и free() задачи, они имеют несколько преимуществ перед ними. Во-первых, оператор new автоматически выделяет требуемое для хранения объекта заданного типа количество памяти. Вам теперь не нужно использовать sizeof, например, для подсчета требуемого числа байтов. Это уменьшает вероятность ошибки. Во-вторых, оператор new автоматически возвращает указатель на заданный тип данных. Вам не нужно выполнять приведение типов, операцию, которую вы делали, когда выделяли память, с помощью функции ntaUoc() (см. следующее замечание). В-третьих, как оператор new, так и оператор delete можно перегружать, что дает возможность простой реализации вашей собственной, привычной модели распределения памяти. В-четвертых, допускается инициализация объекта, для которого динамически выделена память. Наконец, больше нет необходимости включать в ваши программы заголовок <cstdlib>.
В языке С при присваивании указателю возвращаемого функцией malloc() значения не требуется приведение типов, поскольку тип void *(тип возвращаемого функцией mallocf) указателя) автоматически преобразуется в тип.
120.
Самоучитель C++
совместимый с типом указателя, стоящего слева от знака равенства. Однако для C++ этот случай не подходит. При использовании функции mallocf) требуемся полное приведение типов. Смысл этого отличия в том, что оно позволяет C++ усилить контроль типа при возвращении функцией значения.
Теперь, после введения операторов new и delete, они будут использоваться в программах вместо функций шаІІ0С() и free().
1. Для начала рассмотрим программу выделения памяти для хранения целого:
// Простой пример операторов new и delete #include <iostream> using namespace std;
int main()
I
int *p;
p = new int; // выделение памяти для целого
COUt << "Ошибка выделения памяти \пГ1;
return 1;
?
*р = 1000;
cout << "Это целое г на которое указывает р: м << *р « "\п";
delete р; // освобождение памяти return 0;
Обратите внимание, что возвращаемое оператором new значение перед использованием проверяется. Как уже упоминалось > эта проверка имеет значение только в том случае, если в вашем компиляторе при неудачной попытке выделения памяти оператор new возвращает нулевой указатель.
2. Пример, в котором память объекту выделяется динамически:
// Динамическое выделение памяти объектам #include <iostream> using namespace std;
class samp { int і г j ; public:
I!p)
void set_ij (int a, int b) { і = a; j = b; }
Предыдущая << 1 .. 31 32 33 34 35 36 < 37 > 38 39 40 41 42 43 .. 206 >> Следующая