LINUX.ORG.RU

История изменений

Исправление 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* (не уверен, что-там еще выполняется кроме этого).