Звідки оператор delete дізнається скільки байт слід звільнити - stack overflow російською

Щось я задумався про те, що не розумію однієї начебто тривіальної речі.

Звідки оператор delete [] дізнається про те, що потрібно звільнити саме 20 * sizeof (int) байт?

Що станеться в результаті виконання наступного коду:

і коректний він взагалі? Висновок на консоль:

Тобто між виділеними областями пам'яті є ще 64 розряду. Останнє число завжди парне, і мінімум на 2 більше, ніж розмір першого масиву.

Ще один експеримент (вище було на Win7 / Qt / mingw), тепер Ubunto14.04 / Qt / g ++:

Висновок на консоль:

Оператор "new з квадратними дужками» зберігається інформація про кількість елементів масиву. delete [] дістає цю інформацію і викликає деструктори у елементів.

Компілятор може згенерувати код для цих операторів наступним чином:

Прімечаніе1: Насправді замість malloc і free викликаються функції void * operator new [] (size_t bytes) і void operator delete [] (void *). Але тому що вони викликають щось схоже на malloc / free, то в контексті даного питання цим можна знехтувати.

Прімечаніе2: Для обробки виключень, компілятор буде генерувати try-catch блок для new [].

Тобто навіть при застосуванні оператора delete [] до копії покажчика, даний оператор звернеться до відповідної пам'яті (яка була виділена одночасно з даними і на яку десь в області даних зберігається ще один покажчик, ну або якось так), яка відповідає за кількість спочатку виділених байт за таким вказівником, в результаті, врахує розмір спочатку виділеної пам'яті при видаленні? - StateItPrimitive 8 Квітня '16 о 7:50

З приводу ж другої частини не зовсім впевнений, давно з C ++ не працював, але проблеми не бачу, ніби все коректно:

відповідь даний 14 дек '15 о 23:50