![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
1) Почему в MSVC new(std:: nothrow) называют placement? Он же за исключением "негенерации исключений" не отличается от обычного new, который там же называют noplacement.
В то же время не выделяющий памяти "размещающий" new(), который существенно отличается от обоих вышеприведенных, тоже называют plаcement. Что подразумевается под placement если не размещающий? 2) Вот пример из Help MSVC
По сути память была инициализирована в первой инструкции главной функции. Однако о размещении в ней значения 7, в комментариях говорится как о (повторной) инициализации. В чем тут фишка? В том, что размещающая форма new в общем случае может разместить туда значение другого типа, что является "переинициализацией" памяти? |
|||
|
||||
zim22 |
|
||||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
обычный оператор new выделяет память под объект из free store. адрес памяти будет любой. например
но placement new позволяет разместить объект в заранее определённом месте например
или сюда:
Это сообщение отредактировал(а) zim22 - 14.9.2009, 10:29 |
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
new(nothrow) не называют placement, вы что-то путаете |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Тогда может я чего то неправильно понимаю из следующей выдержки из Help MSVC Allocates block of memory from heap
Remarks This form of operator new is known as scalar new, in contrast to the vector new form (operator new[]). The first form of this operator is known as the nonplacement form. The second form of this operator is known as the placement form and the third form of this operator is the nonthrowing, placement form. The first form of the operator is defined by the compiler and does not require new.h to be included in your program. |
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
попробую объяснить доступно
оператор new может бросать исключение типа bad_alloc, nothrow и placement не бросают это исключение, nothrow версия new - возвращает 0, placement не выделяет память, поэтому то-же не может nothrow placement, это нонсенс, невозможное и бессмысленное сочетание ![]() Добавлено через 7 минут и 12 секунд
|
||||
|
|||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Ну значит имеют место быть "неточности" в приведенном ранее фрагменте документации MSVC (7,9) или они вкладывают свой "смысл" в placement.
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
действительно, nothrow версию new то-же называют placement правда, по какой причине, я не знаю, видимо они placement, потому, что используются явно, вместо обычного new, замещают его
![]() |
|||
|
||||
UnrealMan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Из описания синтаксиса видно, что new-placement может использоваться, а может не использоваться. Если new-placement используется, то в функцию operator new передаются дополнительные аргументы, указанные в expression-list. Соответственно, все функции operator new, которые могут принимать дополнительные аргументы (в добавок к первому типа size_t), называются placement allocation function. Если new-expression не смогло создать объект из-за того, что конструктор объекта выкинул исключение, то при наличии placement deallocation function (operator delete то бишь), список дополнительных параметров которой в точности совпадает с оным у заюзаной placement allocation function, эта deallocation function будет вызвана с теми же дополнительными аргументами, чтобы освободить выделенную память (если такой соответствующей operator delete нету, то будет утечка памяти). Это сообщение отредактировал(а) UnrealMan - 31.10.2009, 17:04 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |