Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Замечание

ЗАМЕЧАНИЕ

ЗАМЕЧАНИЕ

Чтобы использовать средства управления памятью C + + для выделения пространства в куче для объектов, в которых перетружен оператор new, поставьте перед оператором двойное двоеточие. Например, и строке

BNew *х =::new BrandNew игнорируется перегруженный в объектах класса BNew оператор new. Аналогично,::delete служит для обращения к оператору delete, используемому по умолчанию.

Установка обработчика ошибок оператора new

Обычно, если new не может выполнить запрос выделения памяти, оператор возвращает null.

Для того что­бы изменить действия, предпринимаемые по умолчанию в этом случае, в C++ следует присвоить адрес функ­ции-обработчика ошибок указателю _new__handler, определенному следующим образом:

typedef void (*vfp)(void);

vfp _new_handler;

Использование typedef не обязательно, но оно облегчает чтение объявления. Функция-обработчик ошибок ничего не возвращает и не имеет аргументов, она устанавливается с помощью вызова функции set_new_handler(), прототип которой содержится в файле NEW.H:

vfp set_new_handler(vfp);

Обработчик ошибок реализуется так же, как и обычная функция C++. Например, вы можете аварийно за­вершить программу с сообщением об ошибке нехватки памяти:

void memerr(void)

{

fputs("\n\nOut of memory\n", stderr);

exit(1);

}

Для того чтобы функция memerrO вызывалась в случае возникновения ошибок, связанных с нехваткой па­мяти, передайте адрес memerr функции set_new_handler() следующим образом;

set_new_handler(memerr);

Смотри также описание set_jiew_handler() в книге Освоение Borland C++. Энциклопедия функций.

Копирование объектов классов

Когда один объект класса копируется в другой объект совместимого типа, могут получиться самые неожи­данные результаты, в особенности это касается классов, в которых объявлены члены-указатели на данные. Обратите внимание на следующие четыре опасные ситуации.

• Когда один объект используется при объявлении нового объекта этого же класса для его инициализации.

• Когда объект передается функции параметром типа класса по значению.

• Когда функция возвращает объект класса (но не ссылку или указатель на объект).

• Когда в операторе один объект присваивается другому.

В первых трех случаях происходит создание и инициализация новой копии объекта существующим объектом класса. В четвертом случае один существующий объект присваивается другому, ранее объявленному объекту.

Имейте в виду, что существует разница между копированием объекта и присваиванием одного объекта другому, В первых трех случаях объекты создаются с помощью вызова конструктора, в четвертом — присваивание одного объекта другому не создает нового объекта и, следовательно, не приводит к вызову конструктора.

После копирования объекта может показаться, что все в порядке, однако, если объект класса содержит члены-указатели на данные, могут возникнуть неприятности. Копирование подобных объектов может привести к появлению указателей, ссылающихся на одно и то же место в памяти. Удаление одного из таких указателей приведет к тому, что другие указатели будут ссылаться на освобожденный участок памяти. Еще более печаль­но то, что удаление одного и того же участка памяти более одного раза в деструкторе класса может привести к разрушению кучи.

 

В C++ существует два механизма для безопасного копирования и присваивания объектов классов, имею­щих члены-указатели: почленная инициализация и почленное присваивание.

 

 

<== предыдущая лекция | следующая лекция ==>
 | 
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 419; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.