Здесь присутствует ряд недоразумений
char *pz = new char[sizeof(IntObj) * 2]; // fine
char *pz2 = &pz[sizeof(IntObj)]; // fine
char *pz3 = new char[sizeof(IntObj) / 2]; // fine
char **pzz = &pz2; // fine
pzz[sizeof(IntObj)] = pz3; // bad
pzz
- это указатель, который указывает только на один char*
, который является переменной pz2
.Это означает, что любой доступ или модификация после pzz[0]
является неопределенным поведением (очень плохо).Вы, вероятно, изменяете содержимое какой-то другой переменной.
new (&pzz) IntObj; // questionable
Это создает IntObj
в пространстве переменной pzz
, а не там, куда указывает pzz
.Конструктор курса устанавливает a
в 8
, тем самым растоптывая содержимое pzz
(больше не будет указывать на pz2
).Я не уверен, является ли это само по себе неопределенным поведением (так как было бы место для целого IntObj
), но с использованием это, безусловно, равно:
IntObj *ss = reinterpret_cast<IntObj *>(&pzz); // bad
Это нарушает правило строгого наложения имен.Хотя стандарт является щедрым для char*
псевдонимов, он не допускает псевдонимы char**
- IntObj*
.Это демонстрирует более неопределенное поведение.
Если ваш вопрос сводится к тому, можете ли вы использовать два независимых и смежных блока памяти как один блок, то нет, вы не можете.