| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > new : пара вопросов по терминологии |
| Автор: FCM 14.9.2009, 10:15 | ||
| 1) Почему в MSVC new(std:: nothrow) называют placement? Он же за исключением "негенерации исключений" не отличается от обычного new, который там же называют noplacement. В то же время не выделяющий памяти "размещающий" new(), который существенно отличается от обоих вышеприведенных, тоже называют plаcement. Что подразумевается под placement если не размещающий? 2) Вот пример из Help MSVC
По сути память была инициализирована в первой инструкции главной функции. Однако о размещении в ней значения 7, в комментариях говорится как о (повторной) инициализации. В чем тут фишка? В том, что размещающая форма new в общем случае может разместить туда значение другого типа, что является "переинициализацией" памяти? |
| Автор: zim22 14.9.2009, 10:25 | ||||||
обычный оператор new выделяет память под объект из free store. адрес памяти будет любой. например
но placement new позволяет разместить объект в заранее определённом месте например
или сюда:
|
| Автор: Lazin 14.9.2009, 10:33 |
new(nothrow) не называют placement, вы что-то путаете |
| Автор: FCM 14.9.2009, 14:39 | ||
Тогда может я чего то неправильно понимаю из следующей выдержки из 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 14.9.2009, 15:46 | ||||
| попробую объяснить доступно оператор new может бросать исключение типа bad_alloc, nothrow и placement не бросают это исключение, nothrow версия new - возвращает 0, placement не выделяет память, поэтому то-же не может nothrow placement, это нонсенс, невозможное и бессмысленное сочетание Добавлено через 7 минут и 12 секунд
|
| Автор: FCM 14.9.2009, 17:13 |
| Ну значит имеют место быть "неточности" в приведенном ранее фрагменте документации MSVC (7,9) или они вкладывают свой "смысл" в placement. |
| Автор: UnrealMan 31.10.2009, 16:57 | ||||
Из описания синтаксиса видно, что 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 нету, то будет утечка памяти). |