void*operator new(size_t size); // объектлар учун
void*operator new[](size_t size);//объектлар массиви учун
Бу прототиплар «new.h» сарлавҳа файлида жойлашган. Шу сабабли, агар new ва delete операторларни қайта юклаш зарур бўлганда бу файлни программага қўшиш керак.
Шунга эътибор бериш керакки, new оператор функциясидаги size параметрининг байтлардаги ўлчамини (sizeof(size)), яъни хотирадан ажратилиши керак соҳанинг байтлардаги ўлчамини оператор функция учун компиляторнинг ўзи ҳисоблаб беради. Оператор функцияга бу параметрнинг қўйилишига сабаб шундаки, ҳосилавий синфлар operator new() ва operator new[]() функцияларини ворислик билан олади ва ҳосилавий синф объектларининг ўлчами таянч синф объектлари ўлчамидан фарқ қилиши мумкин.
Агар хотирадаги олдин ажратилган жойни қайтадан «тақсимлаш» зарур бўлса, new операторининг қўшимча параметрга эга бўлган жойлашувчи шаклидан фойдаланиши мумкин. Мос оператор функция синтаксиси қуйидаги кўринишига эга:
// объектлар учун
void* operator new(size_t size, void* p);
// объектлар массиви учун
void* operator new(size_t Type_size, void* p);
Одатда new операторининг жойлашувчи шаклидан глобал объектлар учун, турга келтириш амали бажарилган ҳолда қўлланилади. Бу вариантда абсолют адрес бўйича олдиндан ажратилган жойга объектни жойлаштириш амалга оширилади. Кўрсатилган адрес уюмдан бўлиши шарт эмас. Жойлашадиган объект ўлчами кўрсатилган соҳада ўлчамидан кичик бўлган ҳолларда ажратилган соҳани коррект равишда тозалаш фойдаланувчи зиммасига юклатилади, чунки delete оператори тўғри ишлашига кафолат йўқ.
Қайта юкланган new операторини чақириш синтаксиси қуйидагича:
<::> new <тур узунлиги> <тур номи> <(<инициализатор>)> ёки
<::> new <тур узунлиги> (<тур номи>) <(<инициализатор>)>
Бу ерда
<::> - шарт бўлмаган, кўриниш соҳасига рухсат бериш оператори;
<тур узунлиги> - operator new() функциясининг size параметри, кўрсатилмаслиги мумкин;
<тур номи> - хотира ажратиладиган берилганнинг тури;
<(<инициализатор>)> - <тур номи> турининг конструктори учун узатиладиган бошланғич қийматлар рўйхати. Рўйхат кўрсатилмаслиги мумкин.
Синтаксис шуни кўрсатадики, new операторини объектга бошланғич қиймат бериш билан чақириш мумкин. Лекин, бу операторни объектлар массиви учун чақирилганда инициализацияни ишлатиб бўлмайди ва объектларнинг бошланғич қийматлари ноаниқ бўлади.
Глобал new ва delete операторларини қайта аниқлаш ва қайта юклашга мисол келтирамиз:
#include
Do'stlaringiz bilan baham: |