8.4. – листинг. Динамик хотирани ажратиш, ундан фойдаланиш ва уни бўшатиш.
# include < iostream.h>
int main()
{
int local variable = 5;
int * pLocal = & local variable;
pHeap = 7;
cout << “local variable:” << local variable <<”\n”;
cout << “ *pLocal: ”<< *pLocal << “\n”;
cout << “ *pHeap: ” << *pHeap << “\n”;
delete pHeap;
pHeap = new int;
*pHeap = 9;
cout <<“*pHeap:”<<*pHeap << “\n”;
delete pHeap;
return 0;
}
НАТИЖА:
local variable: 5
*pLocal: 5
*pHeap: 7
*pHeap: 9
Хотиранинг сирқиб кетиши нима ?
Кўрсаткичлар билан эътиборсиз ишлаш натижасида хотиранинг сирқиб кетишига йўл қўйиш мумкин. Бу кўрсаткич мурожаат қилиб турган хотира бўшатилмасдан, шу кўрсаткичга янги қиймат ўзлаштирилган вақтда рўй беради. Бундай ҳолатга қуйида мисол келтирилган:
1.unsigned short int*pPointer=new unsigned short int;
2. *pPointer = 72;
3. pPointer = new unsigned short int;
4. *pPointer = 84;
1 – cатрда кўрсаткич эълон қилиняпти ва unsigned short int типидаги ўзгарувчини сақлаш учун хотира ажратилаяпти. Навбатдаги сатрда ажратилган соҳага 72 қиймат ёзилди. 3 – сатрда эса кўрсаткичга хотира соҳасининг бошқа адреси ўзлаштирилди ва у адресдаги соҳага 84 қиймат ўзлаштирилди. Бу операциялардан кейин 72 қийматни сақлаб турган хотира соҳасига мурожаат қилиш имкони йўқолди. Чунки, бу соҳанинг кўрсаткичига янги қиймат берилди. Натижада, резервланган хотирани дастур ишини тугатгунча умуман ишлатиб бўлмайди. Бундай ҳолларда қуйидагича ёзув тўғри бўлар эди.
unsigned short int* pPointer= new unsigned short int;
*pPointer = 72;
delete pPointer;
pPointer = new unsigned short int;
*pPointer = 84;
Бу ҳолда ўзгарувчи учун ажратилган хотира тўғри бўшатилади.
Do'stlaringiz bilan baham: |