8.4.5. Оператор размещения new А

8.4.5. Оператор размещения new А

Существует третья форма оператора new, которая создает объект без отведения для него памяти, то есть в памяти, которая уже была выделена. Эту форму называют оператором размещения new. Программист указывает адрес области памяти, в которой размещается объект:

new (place_address) type-specifier

place_address должен быть указателем. Такая форма (она включается заголовочным файлом new) позволяет программисту предварительно выделить большую область памяти, которая впоследствии будет содержать различные объекты. Например:

#include iostream

#include new

const int chunk = 16;

class Foo {

public:

int val() { return _val; }

FooQ(){ _val = 0; }

private:

int _val;

};

// выделяем память, но не создаем объектов Foo

char *buf = new char[ sizeof(Foo) * chunk ];

int main() {

// создаем объект Foo в buf

Foo *pb = new (buf) Foo;

// проверим, что объект помещен в buf

if ( pb.val() == 0 )

cout "Оператор new сработал!" endl;

// здесь нельзя использовать pb

delete[] buf;

return 0;

}

Результат работы программы:

Оператор new сработал!

Для оператора размещения new нет парного оператора delete: он не нужен, поскольку эта форма не выделяет память. В предыдущем примере необходимо освободить память, адресуемую указателем buf, а не pb. Это происходит в конце программы, когда буфер больше не нужен. Поскольку buf ссылается на символьный массив, оператор delete имеет форму

delete[] buf;

При уничтожении buf прекращают существование все объекты, созданные в нем. В нашем примере pb больше не ссылается на существующий объект класса Foo.

Упражнение 8.5

Объясните, почему приведенные операторы new ошибочны:

(a) const float *pf = new const float[100];

(b) double *pd = new doub1e[10] [getDim()];

(c) int (*pia2)[ 1024 ] = new int[ ][ 1024 ];

(d) const int *pci = new const int;

Упражнение 8.6

Как бы вы уничтожили pa?

typedef int arr[10];

int *pa = new arr;

Упражнение 8.7

Какие из следующих операторов delete содержат потенциальные ошибки времени выполнения и почему:

int globalObj;

char buf[1000];

void f() {

int *pi = global0bj;

double *pd = 0;

float *pf = new float(O);

int *pa = new(buf)int[20];

delete pi; // (a)

delete pd; // (b)

delete pf; // (c)

de1ete[] pa; // (d)

}

Упражнение 8.8

Какие из данных объявлений auto_ptr неверны или грозят ошибками времени выполнения? Объясните каждый случай.

int ix = 1024;

int *pi = ix;

int *pi2 = new int ( 2048 );

(a) auto_ptrint p0(ix);

(b) auto_ptrint pl(pi);

(c) auto_ptrint p2(pi2);

(d) auto_ptrint p3(ix);

(e) auto_ptrint p4(new int(2048));

(f) auto_ptrint p5(p2.get());

(9) auto_ptrint p6(p2.release());

(h) auto_ptrint p7(p2);

Упражнение 8.9

Объясните разницу между следующими инструкциями:

int *pi0 = p2.get();

int *pi1 = p2.release() ;

Для каких случаев более приемлем тот или иной вызов?

Упражнение 8.10

Пусть мы имеем:

auto_ptr string ps( new string( "Daniel" ) );

В чем разница между этими двумя вызовами assign()?Какой их них предпочтительнее и почему?

ps.get()-assign( "Danny" );

ps-assign( "Danny" );

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

1.4.8 Оператор for

Из книги C++ автора Хилл Мюррей

1.4.8 Оператор for Рассмотрим копирование десяти элементов одного вектора в другой:for (int i=0; i«10; i++) q[i]=p[i];Это эквивалентно int i = 0; while (i«10) (* q[i] = p[i]; i++; *) но более удобочитаемо, поскольку вся информация, управляющая циклом, локализована. При применении операции ++ к целой


1. Оператор Select – базовый оператор языка структурированных запросов

Из книги Базы данных: конспект лекций автора Автор неизвестен

1. Оператор Select – базовый оператор языка структурированных запросов Центральное место в языке структурированных запросов SQL занимает оператор Select, с помощью которого реализуется самая востребованная операция при работе с базами данных – запросы.Оператор Select


Изменение размещения папок и каталогов

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Изменение размещения папок и каталогов Изменение размещения папки Избранное Для того чтобы изменить размещение папки Избранное, следует написать новый путь к этой папке в следующий ключ:[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell


Изменение размещения папки Избранное

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Изменение размещения папки Избранное Для того чтобы изменить размещение папки Избранное, следует написать новый путь к этой папке в следующий ключ:[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell


Оператор BETWEEN

Из книги Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ автора Мейерс Скотт


Правило 52: Если вы написали оператор new с размещением, напишите и соответствующий оператор delete

Из книги Настройка Windows 7 своими руками. Как сделать, чтобы работать было легко и удобно автора Гладкий Алексей Анатольевич

Правило 52: Если вы написали оператор new с размещением, напишите и соответствующий оператор delete Операторы new и delete с размещением встречаются в C++ не слишком часто, поэтому в том, что вы с ними не знакомы, нет ничего страшного. Вспомните (правила 16 и 17), что когда вы пишете такое


Выбор сетевого размещения

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

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


Параметры размещения. Плавающие контейнеры

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

Параметры размещения. Плавающие контейнеры Местоположение блочных контейнеров (и любых других блочных элементов) на Web-странице определяют два весьма примечательных атрибута стиля.Изначально блочные элементы Web-страницы располагаются на ней по вертикали, строго друг


Параметры размещения. Плавающие контейнеры

Из книги Интернет – легко и просто! автора Александров Егор

Параметры размещения. Плавающие контейнеры Местоположение блочных контейнеров (и любых других блочных элементов) на Web-странице определяют два весьма примечательных атрибута стиля.Изначально блочные элементы Web-страницы располагаются на ней по вертикали, строго друг


Пример размещения сайта

Из книги Linux программирование в примерах автора Роббинс Арнольд

Пример размещения сайта Если вы думаете, что разместить свой сайт в Интернете довольно проблематично и для этого необходимо быть хорошим специалистом по сетевым технологиям, то вы глубоко ошибаетесь. На самом деле все не просто, а очень просто! Чтобы не быть голословным,


5.3.2. Функции размещения каталогов BSD

Из книги Поиск персонала с помощью компьютера. Как сэкономить на кадровом агентстве автора Гладкий Алексей Анатольевич

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


Правила размещения вакансий

Из книги C++ для начинающих автора Липпман Стенли

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


8.4.5. Оператор размещения new А

Из книги Linux Mint и его Cinnamon. Очерки применителя автора Федорчук Алексей Викторович

8.4.5. Оператор размещения new А Существует третья форма оператора new, которая создает объект без отведения для него памяти, то есть в памяти, которая уже была выделена. Эту форму называют оператором размещения new. Программист указывает адрес области памяти, в которой


Из истории систем размещёния

Из книги Вопросы истории: UNIX, Linux, BSD и другие автора Федорчук Алексей Викторович

Из истории систем размещёния Не в интересах правды, а истины ради нужно заметить, что ZFS была отнюдь не первой комплексной системой размещёния данных — хотя её исторические предшественницы также именовались просто файловыми системами.Первой из таких предшественниц


Из истории систем размещения

Из книги автора

Из истории систем размещения Не в интересах правды, а истины ради нужно заметить, что комплексные системы размещения данных – отнюдь не порождение мира FOSS, их корни лежат в недрах проприетаризма. И первой из них была, видимо, файловая система Veritas (или VxFS), разработанная