История изменений
Исправление rumgot, (текущая версия) :
Да вроде другого reuse кроме создания объекта в этом storage не существует. В [basic.life] есть пример с такой строкой
new (this) D2; // reuses storage — ends the lifetime of *this
Вот полный текст оттуда:
#include <cstdlib>
struct B {
virtual void f();
void mutate();
virtual ~B();
};
struct D1 : B { void f(); };
struct D2 : B { void f(); };
void B::mutate() {
new (this) D2; // reuses storage — ends the lifetime of *this
f(); // undefined behavior
... = this; // OK, this points to valid memory
}
void g() {
void* p = std::malloc(sizeof(D1) + sizeof(D2));
B* pb = new (p) D1;
pb->mutate();
*pb; // OK: pb points to valid memory
void* q = pb; // OK: pb points to valid memory
pb->f(); // undefined behavior, lifetime of *pb has ended
}
тут не эквивалентный пример, тут на месте всего объекта создается новый. А в моем случае я запрашиваю double[10]
на месте члена.
new-expression, в т.ч. вызывающее non-allocating формы оператора new, создаёт новый объект. А не «приводит одно к другому»
pointer_ = new (buffer_) double[10];
Тут ведь толком ничего не создается. Фактически тут buffer_
просто приводится к double*
(возможно там еще что-то выполняется, не скажу).
Исправление rumgot, :
Да вроде другого reuse кроме создания объекта в этом storage не существует. В [basic.life] есть пример с такой строкой
new (this) D2; // reuses storage — ends the lifetime of *this
Вот полный текст оттуда:
#include <cstdlib>
struct B {
virtual void f();
void mutate();
virtual ~B();
};
struct D1 : B { void f(); };
struct D2 : B { void f(); };
void B::mutate() {
new (this) D2; // reuses storage — ends the lifetime of *this
f(); // undefined behavior
... = this; // OK, this points to valid memory
}
void g() {
void* p = std::malloc(sizeof(D1) + sizeof(D2));
B* pb = new (p) D1;
pb->mutate();
*pb; // OK: pb points to valid memory
void* q = pb; // OK: pb points to valid memory
pb->f(); // undefined behavior, lifetime of *pb has ended
}
тут не эквивалентный пример, тут на месте всего объекта создается новый. А в моем случае я запрашиваю double[10]
на месте члена.
new-expression, в т.ч. вызывающее non-allocating формы оператора new, создаёт новый объект. А не «приводит одно к другому»
pointer_ = new (buffer_) double[10];
Тут ведь толком ничего не создается. Фактически тут buffer_
просто приводится к double*
(не уверен, что-там еще выполняется кроме этого).
Исходная версия rumgot, :
Да вроде другого reuse кроме создания объекта в этом storage не существует. В [basic.life] есть пример с такой строкой
new (this) D2; // reuses storage — ends the lifetime of *this
Вот полный текст оттуда:
#include <cstdlib>
struct B {
virtual void f();
void mutate();
virtual ~B();
};
struct D1 : B { void f(); };
struct D2 : B { void f(); };
void B::mutate() {
new (this) D2; // reuses storage — ends the lifetime of *this
f(); // undefined behavior
... = this; // OK, this points to valid memory
}
void g() {
void* p = std::malloc(sizeof(D1) + sizeof(D2));
B* pb = new (p) D1;
pb->mutate();
*pb; // OK: pb points to valid memory
void* q = pb; // OK: pb points to valid memory
pb->f(); // undefined behavior, lifetime of *pb has ended
}
тут не эквивалентный пример, тут на месте всего объекта создается новый.
new-expression, в т.ч. вызывающее non-allocating формы оператора new, создаёт новый объект. А не «приводит одно к другому»
pointer_ = new (buffer_) double[10];
Тут ведь толком ничего не создается. Фактически тут buffer_
просто приводится к double*
(не уверен, что-там еще выполняется кроме этого).