Чи використовується ця специфіка для компілятора?
Насправді це майже завжди особливість бібліотеки часу виконання (як, наприклад, бібліотека часу виконання C). Час виконання зазвичай сильно співвідноситься з компілятором, але є деякі комбінації, які можна замінити.
Я вважаю, що в Windows купі налагодження (HeapAlloc тощо) також використовуються спеціальні шаблони заповнення, які відрізняються від тих, що надходять від malloc та вільних реалізацій в бібліотеці виконання налагодження C. Тож це може бути і функцією ОС, але в більшості випадків це лише бібліотека часу виконання мови.
Чи працює так, як malloc / new та free / delete однаково щодо цього?
Частина керування пам'яттю нових та видалених зазвичай реалізується з malloc та вільною, тому пам'ять, що виділяється новою та видаленою, зазвичай має однакові функції.
Це конкретна платформа?
Деталі конкретні для виконання. Фактичні значення, які використовуються, часто вибираються таким чином, щоб не лише виглядати незвично і очевидно, коли дивляться на шестигранний дамп, але розроблені так, щоб мати певні властивості, які можуть скористатись функціями процесора. Наприклад, непарні значення часто використовуються, оскільки вони можуть спричинити помилку вирівнювання. Великі значення використовуються (на відміну від 0), оскільки вони викликають дивовижні затримки, якщо ви переходите до неініціалізованого лічильника. На x86 0xCC - int 3
інструкція, тому якщо ви виконаєте неініціалізовану пам'ять, вона потрапить у пастку.
Чи відбудеться це в інших операційних системах, таких як Linux або VxWorks?
Це здебільшого залежить від бібліотеки виконання, яку ви використовуєте.
Чи можете ви навести якісь практичні приклади, як ця ініціалізація корисна?
Я перерахував деякі вище. Ці значення, як правило, вибираються, щоб збільшити шанси на те, що трапиться щось незвичне, якщо ви робите щось з недійсними частинами пам'яті: тривалі затримки, пастки, помилки вирівнювання тощо. Менеджери купи також іноді використовують спеціальні значення заповнення для пропусків між розподілами. Якщо ці шаблони колись змінюються, він знає, що десь була погана запис (як перекриття буфера).
Я пам’ятаю, що читав щось (можливо, у Code Complete 2), що при розподілі пам'яті добре ініціалізувати пам'ять до відомої схеми, і певні шаблони спричинить переривання в Win32, що призведе до винятків, що відображаються у відладчику.
Наскільки це портативно?
Написання твердого коду (а може бути і повного коду ) розповідає про речі, які слід враховувати при виборі шаблонів заповнення. Деякі з них я згадав тут, а стаття Вікіпедії про Магічне число (програмування) також їх підсумовує. Деякі хитрощі залежать від специфіки процесора, який ви використовуєте (наприклад, потрібен він для вирівнювання читання і запису, а також значення, які відображаються в інструкціях, які потраплять у пастку). Інші хитрощі, як-от використання великих значень та незвичайних значень, які виділяються на дампі пам'яті, є більш портативними.