Описание тега placement-new

В C++ размещение new используется для создания объекта в определенном месте памяти или для передачи дополнительных аргументов функции распределения.
1 ответ

C++ размещение нового против копирования назначения

Где-то я читал, что вектор внутренне использует размещение новых для построения объектов. Когда я пытался реализовать подобный контейнер, я обычно получал _elements = new Type[capacity] а потом я добавляю новые объекты, как это void append(const T&a…
24 апр '15 в 08:49
2 ответа

Как работает размещение новых?

Я написал следующее, думая, что это должно быть segfault во время выполнения. Однако это не так, он работает нормально, и я не понимаю, почему. #include <cstdlib> #include <cstdio> #include <new> struct MyStruct { double *a; MyStru…
23 дек '14 в 18:24
1 ответ

Переопределение нового, но указание unordered_map не использовать его

Я пишу сборщик мусора для C/C++ как упражнение по программированию, и часть этого включает глобальное переопределение new, Однако сборщик мусора также использует unordered_map (для хранения указателей на выделенные блоки), и все будет серьезно испор…
1 ответ

Размещение массива, новое в сочетании с _aligned_malloc, как правильно удалить?

Начали экспериментировать с размещением new а также delete наряду с выравниванием памяти, и это похоже на то, чтобы быть умным смарфом в лаборатории папаша смурфа. Допустим, у меня есть объект, например, struct obj { ... }; и я хочу разместить в выр…
24 фев '17 в 09:14
1 ответ

Передача нулевого указателя на размещение нового

Размещение по умолчанию new Оператор объявлен в 18.6 [support.dynamic] ¶1 с ненулевой спецификацией исключения: void* operator new (std::size_t size, void* ptr) noexcept; Эта функция не делает ничего, кроме return ptr; поэтому разумно noexceptоднако…
10 июл '13 в 12:50
2 ответа

Как реализовать простой контейнер с размещением новых и внедрением функциональности?

Мне нужно реализовать контейнер для хранения количества элементов и по какой-то причине он должен работать без какого-либо выделения кучи. Другое требование состоит в том, что элементы контейнера не должны копироваться или перемещаться каким-либо об…
03 окт '15 в 18:33
1 ответ

Внутренняя обработка размещения новых?

В одном интервью меня спросили, что Предположим, у вас есть 25 МБ памяти и три процесса по 10 МБ каждый. Как гарантировать, что ваш процесс не должен исчерпать память? Я ответил, что если я использую placement new это выживет. Они спросили меня, как…
07 окт '13 в 04:41
1 ответ

Рекурсивное размещение размещения

Можно ли сделать рекурсивное размещение размещения?если у меня есть этот класс: class A { private: int m_filed1; char* m_field2; public: A(int size) { m_field1 = size; m_field2 = new char[size]; } }; и я хочу динамически разместить его в определенно…
04 ноя '12 в 12:44
5 ответов

Мне действительно нужно беспокоиться о выравнивании при использовании нового оператора размещения?

Я прочитал это. Когда я должен беспокоиться о выравнивании? но я все еще не знаю, нужно ли мне беспокоиться о не выровненном указателе, возвращаемом оператором размещения new - как в этом примере: class A { public: long double a; long long b; A() : …
02 авг '12 в 16:19
11 ответов

Как распределить структуры переменного размера в памяти?

Я использую C++, и у меня есть следующие структуры: struct ArrayOfThese { int a; int b; }; struct DataPoint { int a; int b; int c; }; В памяти я хочу иметь 1 или более элементов ArrayOfThese в конце каждой DataPoint. В DataPoint не всегда одинаковое…
26 окт '09 в 19:28
1 ответ

Сохранение строки как char[] с размещением new и возвращением

Я хочу написать класс, который содержит информацию о строке в памяти и которая может вернуть ее мне. Итак, я начал с Союза, который содержит размер строки. (почему объединение здесь не имеет значения, но оно должно быть объединением для других типов…
25 сен '15 в 07:47
2 ответа

Размещение нового, чтобы получить динамический размер

На основании этого вопроса: Распределение типа переменного размера Будет ли следующая работа? { // size calculated. std::auto_ptr<Base> p(new((void*)(new char[size])) Packet()); // Do Stuff } Где Packet - это структура POD, где последний член …
4 ответа

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

Я пытаюсь выяснить, является ли следующее неопределенным поведением. Я чувствую, что это не UB, но мое чтение стандарта делает его похожим на UB: #include <iostream> struct A { A() { std::cout << "1"; } ~A() { std::cout << "2"; } }…
1 ответ

Используя инициализированную переменную после размещения нового из конструктора, отключающего UB?

Независимо от того, может ли быть достигнуто следующее с помощью других, более безопасных конструкций - меня просто интересует, приводят ли следующие результаты к четко определенному результату. Предположим, у вас есть структура A: struct A { Foo* f…
04 мар '17 в 19:46
0 ответов

C++ atomic "сравнить и установить на ноль или приращение"

Рассмотрим следующую (надуманную) арену памяти (пул): template<typename T> class Arena { public: Arena(size_t size) : m_buffer(new char[size * sizeof(T)]), m_next_available(0), m_size(size) { } void* placement() { return m_buffer.get() + (m_ne…
03 дек '13 в 23:23
2 ответа

Строгий псевдоним C++, когда не используется указатель, возвращаемый путем размещения new

Может ли это привести к неопределенному поведению? uint8_t storage[4]; // We assume storage is properly aligned here. int32_t* intPtr = new((void*)storage) int32_t(4); // I know this is ok: int32_t value1 = *intPtr; *intPtr = 5; // But can one of th…
2 ответа

std:: необязательный, реализованный как union против char[]/align_storage

Читая через реализацию GCC std::optional Я заметил кое-что интересное. я знаю boost::optional реализован следующим образом: template <typename T> class optional { // ... private: bool has_value_; aligned_storage<T, /* ... */> storage_; }…
14 сен '18 в 19:34
1 ответ

Безопасно ли сочетать sizeof и размещение новых?

Рассмотрим следующий класс: template <class T> class defer { public: template <class ...Args> void construct(Args&&...); T& obj(); ~defer(); private: std::uint8_t memory[sizeof(T)]; T * ptr(); }; template <class T> temp…
25 окт '12 в 15:48
1 ответ

Как освободить память по указателю a (размещение нового)?

Я не могу понять, как правильно освободить память с помощью указателя MemoryManager mm; char* a = new(mm) char[len];
28 апр '17 в 17:57
0 ответов

C++ размещение новых для локальных объектов

Это нормально использовать placement new для автоматических объектов? Пожалуйста, рассмотрите следующий пример: class Button { public: Button() { } virtual ~Button() { } // and a lot of members }; class Screen { public: Screen() { } virtual ~Screen(…
30 мар '17 в 12:27