Размещение новых с разными типами - PullRequest
0 голосов
/ 10 апреля 2020

Хорошо ли определено поведение в стандартах 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...