Вопросы с тегом 'placement-new'

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

Размещение массива-new требует неопределенных накладных расходов в буфере?

5.3.4 [expr.new] проекта С++ 11 февраля приведен пример: new(2,f) T[5] приводит к вызову operator new[](sizeof(T)*5+y,2,f). Здесь x и y - неотрицательные неопределенные значения, представляющие издержки распределения массива; результат нового выр...
04 янв. '12 в 0:03
6

Почему в С++ 17 нет std :: construct_at?

С++ 17 добавляет std::destroy_at, но нет аналога std::construct_at. Это почему? Разве это не может быть реализовано так просто, как показано ниже? template <typename T, typename... Args> T* construct_at(void* addr, Args&&... args) { ...
24 окт. '18 в 10:23
10

С++, можно ли вызвать конструктор напрямую, без новых?

Могу ли я вызвать конструктор явно, не используя new, если у меня уже есть память для объекта? class Object1{ char *str; public: Object1(char*str1){ str=strdup(str1); puts("ctor"); puts(str); } ~Object1(){ ...
22 мар. '10 в 17:44
1

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

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

malloc & placement new vs. new

Я рассматривал это в течение последних нескольких дней, и до сих пор я действительно не нашел ничего убедительного, кроме догматических аргументов или призывов к традиции (т.е. "это С++-путь!" ). Если я создаю массив объектов, что является убедитель...
22 янв. '12 в 7:16
3

Является ли "переупорядочивание" ссылок на С++ подобным законным?

Является ли следующий законным в С++? Насколько я могу судить, Reference имеет тривиальный деструктор, поэтому он должен быть законным. Но я думал, что ссылки не могут быть восстановлены на законных основаниях... могут ли они? template<class T&...
13 янв. '14 в 21:31
3

Почему конструкторы не могут быть явно вызваны, пока деструкторы могут?

В следующем коде на С++ я могу явно вызвать деструктор, но не конструктор. Почему это? Не будет ли явным ctor вызывать более выразительный и унифицированный с dtor-кодом? class X { }; int main() { X* x = (X*)::operator new(sizeof(X)); new (...
17 июл. '17 в 10:40
6

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

Иногда приятно начинать заново. В С++ я могу использовать следующий простой маневр: { T x(31, Blue, false); x.~T(); // enough with the old x ::new (&x) T(22, Brown, true); // in with the new! // ... } ...
12 янв. '12 в 2:56
5

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

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

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

Я читал, что когда вы используете размещение new, вам нужно вызвать деструктор вручную. Рассмотрим следующий код: // Allocate memory ourself char* pMemory = new char[ sizeof(MyClass)]; // Construct the object ourself MyClass* pMyClass = new( ...
18 янв. '12 в 23:01
2

Разрешено ли явно вызвать деструктор, за которым следует размещение new на переменной с фиксированным временем жизни?

Я знаю, что вызов деструктора явно может привести к поведению undefined из-за двойного вызова деструктора, как здесь: #include <vector> int main() { std::vector<int> foo(10); foo.~vector<int>(); return 0; // Oops, destruct...
04 мар. '17 в 17:19
7

Использование нового (этого) для повторного использования конструкторов

Это появилось недавно в классе, для которого я преподаватель. Мы преподавали студентам, как делать копии конструкторов в С++, а учащиеся, которые изначально преподавали Java, спросили, можете ли вы назвать один конструктор из другого. Я знаю, что отв...
22 мар. '10 в 20:30
4

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

char * buf = new char[sizeof(T)]; new (buf) T; T * t = (T *)buf; //code... //here I should destruct *t but as it is argument of template and can be //instantiated via basic types as well (say int) so such code /*t->~T();*/ //is incorrect (maybe c...
18 июл. '11 в 8:37
6

Что такое встроенный конструктор на С++?

Возможный дубликат: "Новое место размещения на С++" Что такое встроенный конструктор в С++? например. Datatype * x = new (y) Тип данных();
21 сент. '10 в 19:44
5

Смешивание оператора new [] и размещение нового с обычным удалением []

Просто из любопытства, является ли законным? X* p = static_cast<X*>(operator new[](3 * sizeof(X))); new(p + 0) X(); new(p + 1) X(); new(p + 2) X(); delete[] p; // Am I allowed to use delete[] here? Or is it undefined behavior? Аналогично:...
27 июн. '11 в 16:02