Справочные данные по языку C++_____________________________663

В данном случае в памяти динамически создается объект — действительное
число. В дальнейшем доступ к нему осуществляется как *А. Например:

*А = 5.1;

Labell->Caption = *A;

Если нет желания вводить указатель на объект и в дальнейшем работать с
этим указателем, можно динамически разместить объект с помощью следующего
оператора:

double В = *new double;

В этом случае в дальнейшем на объект можно ссылаться просто по имени — В.
Создание динамически размещенного объекта можно совместить с его инициа-
лизацией. Например:

double *А = new double(5.1);

double В = *new double(5.5);

Ниже приведен пример создания и динамического размещения в памяти ком-
понента — окна редактирования типа TEdit:

TEdit *Edit = new TEdit(this);

Edit->Parent = Formi;

Первый оператор выделяет память под объект и создает его, передавая в него
указатель this как владельца Owner. Второй задает для компонента родителя —
Formi. В этот момент компонент станет виден на форме.

Рассмотрим подробнее выполнение операции new при создании и размещении
в памяти объекта. Операция определяет объем необходимой памяти, использую
неявно операцию sizeof(Tmi). Если в динамически распределяемой области памяти
есть место для размещения объекта, то выделяется соответствующий блок памяти
и операция new возвращает указатель на объект данного типа. При этом нет необ-
ходимости явно приводить тип этого указателя — все делается автоматически. Со-
зданный объект хранится в памяти пока не будет уничтожен описанной далее опе-
рацией delete или пока на завершится выполнение программы.

Если в памяти невозможно выделить блок требуемого размера, генерируется
исключение bad_alloc. Поэтому в программе всегда надо предусматривать блок
catch (см. раздел 4.9.3 главы 4) который бы перехватывал это исключение прежде,
чем программа попытается получить доступ к создаваемому объекту. Таким обра-
зом, динамическое размещение объектов в памяти как правило должно оформля-
ться следующим образом:

ttinclude <iostream.h>
try
{
Операторы динамического распределения памяти с помощью new

)

catch(std::bad alloc)
{

Операторы действий при недостаточной памяти
)

Можно отменить генерацию исключения bad_alloc, задавая указатель на свой
собственный обработчик событий, связанных с невозможностью выделить память.
Для этого используется оператор

set new handler(указатель)

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