Хорошо ли определено поведение в стандартах C ++ для использования размещения new с различными типами, а затем delete[]
буфера старого типа? Предположим, что выравнивание a
и размер буфера, на который указывает a
, соответствуют требованию для нового размещения B
, а B
либо имеет тривиальный деструктор, либо мы не зависим от какого-либо побочного эффекта b
вызов деструктора.
class A {...};
class B {...};
A *a = new A[16];
B *b = ::new (static_cast<void*>(a)) B;
b->xxx = 123; //use b
delete[] a;
Насколько я понимаю, когда delete[] a
, он вызовет деструктор A
. Но теперь память для a
занята объектом B
. Является ли это четко определенным поведением, если a
имеет: (a) тривиальный деструктор (b) нетривиальный деструктор?
Как насчет того, если мы получим доступ к a
после размещения new? Это нарушает строгое правило наложения имен?
class A {...};
class B {...};
A *a = new A[10];
B *b = ::new (static_cast<void*>(a)) B;
a->yyy = 456;