Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
REFERAT / Dinamikalıq yadtı ajıratıw.docx
Скачиваний:
0
Добавлен:
14.01.2024
Размер:
110.77 Кб
Скачать

Ildirilgen belgiler

C++ bosatilgan yad quramına yamasa óshirilip atırǵan kórsetkish ma`nisine ne bolıwı haqqında hesh qanday kepillik bermeydi. Kóplegen jaǵdaylarda, operatsion sistemaǵa qaytarılǵan yad qaytarılishidan aldınǵı bahalardı óz ishine aladı hám kórsetkish qashannan berli bosatilgan yadqa belgi qılıwda dawam etedi.

Bosatilgan yadqa belgi etiwshi kórsetkish ildirilgen kórsetkish dep ataladı. Tikkeley bolmaǵan kirisiw yamasa ildirilgen kórsetkishni alıp taslaw anıqlanbaǵan minez-qulqlarǵa alıp keledi.

(Jańa) operatori islemey qalıwı múmkin

Operatsion sistema yadtı soraǵanda, kemnen-kem jaǵdaylarda sorawdı qandırıw ushın yad bolmawi múmkin.

Ádetiy bolıp, eger new jumısqa túspewa, bad_alloc esaptan tısqarısı taslanadı. Eger bul esaptan tısqarı tuwrı atqarılmasa (jáne bul biz esaptan tısqarılar yamasa olardıń islewin ele kórip shıqpaǵanımız sebepli bolmasa ), programma islenbegen esaptan tısqarı qátesi menen islemey qaladı.

Kóplegen jaǵdaylarda, jańa esaptan tısqarı qılıw (yamasa programmanı buzıw ) istalmagan, sol sebepli yadtı ajıratıp bolmaytuǵın bolsa, new ga null kórsetkishni qaytarıwdı aytıw ushın isletiliwi múmkin bolǵan jańanıń alternativ forması bar. Bul jańa gilt sóz hám ajıratıw túri ortasında std::notrow konstantasini qosıw arqalı ámelge asıriladı :

int* value = new (std::nothrow) int;

Joqarıdaǵı mısalda, eger new yadtı ajrata almasa, ol ajıratılǵan yad adresi ornına null kórsetkishni qaytaradı.

Itibar beriń, eger siz bul kórsetkish arqalı tikkeley bolmaǵan háreket qılıwdı qálesangiz, bul anıqlanbaǵan minez-qulqlarǵa alıp keledi (programmasıńız isten shıǵıwı múmkin). Sol sebepli, ajıratılǵan yaddan paydalanıwdan aldın, barlıq yad sorawların olardıń rasında orınlanǵanlıǵın tekseriw usınıs etiledi.

int* value{ new (std::nothrow) int{} };

if (!value)

{

std::cout << "Could not allocate memory";

}

Jańa yadtı soraw kemnen-kem jaǵdaylarda (hám derlik hesh qashan islep shıǵıw ortalıǵında ) áwmetsizlikke dus kelgenligi sebepli, bul tekseriw kóbinese unutiladi!

Null kórsetkishler hám dinamikalıq yad ajıratıw

Null kórsetkishler (0 yamasa nullptr adresine ornatılǵan kórsetkishler) dinamikalıq yad ajıratıw menen islewde ásirese paydalı bolıp tabıladı. Dinamikalıq yadtı bólistiriw kontekstinde null kórsetkish " bul kórsetkishke yad ajratilmagan" degen mánisti ańlatadı. Bul bizge shártli túrde yadtı ajıratıw sıyaqlı zatlardı qılıw imkaniyatın beredi:

if (!ptr)

ptr = new int;

Null kórsetkishni óshiriw hesh qanday tásir etpeydi. Bul tómendegilerge bolǵan mútajlikti joq etedi:

if (ptr)

delete ptr;

Bunıń ornına siz jaysha jazıwıńız múmkin:

delete ptr;

Eger ptr nolge teń bolmasa, dinamikalıq túrde ajıratılǵan ózgeriwshi óshiriledi. Eger nol bolsa, hesh nárse bolmaydı.

Yad qateligi

Dinamikalıq túrde ajıratılǵan yad anıq bosatilguncha yamasa programma chiqmaguncha (hám operatsion sistemasıńız onı tazalaguncha) ajıratılǵan bolıp qaladı. Biraq, dinamikalıq túrde ajıratılǵan yad mánzillerin saqlaw ushın isletiletuǵın kórsetkishler jergilikli ózgeriwshiler ushın ápiwayı qamrov qaǵıydalarına ámel etedi. Bul saykes emeslik qızıqlı mashqalalardi keltirip shıǵarıwı múmkin.

Tómendegi funkciyanı kórip shıǵıń :

void doSomething()

{

int* ptr{ new int{} };

}

Bul funkciya int ni dinamikalıq túrde ajratadı, lekin onı hesh qashan óshiriw arqalı bosatadi. Kórsetkish ózgeriwshileri ápiwayı ózgeriwshiler bolǵanı ushın, funkciya tawısıwı menen ptr sheńberi tısqarına shıǵadı. hám ptr dinamikalıq túrde ajıratılǵan int adresin óz ishine alǵan birden-bir ózgeriwshi bolǵanı ushın, ptr joq etilgende, dinamikalıq túrde ajıratılǵan yadqa basqa siltemeler bolmaydı. Bul sonı ańlatadıki, programma endi dinamikalıq túrde ajıratılǵan yad adresin " joǵatdi". Nátiyjede, bul dinamikalıq túrde ajıratılǵan intni óshirip bolmaydı.

Bul yad aynıwı dep ataladı. Yaddıń aǵıwı, programmasıńız operatsion sistemaǵa qaytarıwdan aldın dinamikalıq túrde ajıratılǵan yaddıń bir bólegi adresin joǵatǵanda payda boladı. Bul júz bergende, programmasıńız dinamikalıq túrde ajıratılǵan yadtı alıp taslay almaydı, sebebi ol endi qaydalıǵın bilmaydi. Operatsion sistema da bul yaddan paydalana almaydı, sebebi ol bul yad ele da programmasıńız tárepinen isletilip atır dep esaplaydı.

Yaddıń aǵıwı programma islep atirǵan waqıtta bos yadtı tutınıw etedi jáne bul tekǵana bul programma ushın, bálki basqa programmalar ushın da kemrek yad ámeldegi boladı. Saldamlı yad aǵıw máseleleri bolǵan programmalar barlıq ámeldegi yadtı jeb qoyıwı múmkin, bul bolsa pútkil mashinanıń aste islewine yamasa hátte isten shıǵıwına alıp keledi. Operatsion sistema sizdiń programmasıńız tamamlanılǵannan keyin ǵana sizib ketken yadtı tazalaw hám " qayta tiklew" múmkinshiligine iye boladı.

Kórsetkishtiń kólemden tısqarına shıǵıwı nátiyjesinde yad aǵıwı júzege keliwi múmkin bolsa -de, basqa sebepler de bar. Mısal ushın, dinamikalıq túrde ajıratılǵan yad adresin óz ishine alǵan kórsetkishke basqa baha tayınlanǵan bolsa, yad aǵıwı júz bolıwı múmkin:

int value = 5;

int* ptr{ new int{} };

ptr = &value;

Bunı kórsetkishni qayta belgilewden aldın alıp taslaw arqalı ońlaw múmkin:

int value{ 5 };

int* ptr{ new int{} };

delete ptr;

ptr = &value;

Soǵan kóre, yadtı eki ret ajıratıw arqalı da aǵıwı múmkin:

int* ptr{ new int{} };

ptr = new int{};

Ekinshi bólistiriwden qaytarılǵan mánzil birinshi ajıratılǵan mánzildi qayta jazadı. Sol sebepli, birinshi ajıratıw yad aǵıwına aylanadı!

Qayta belgilewden aldın kórsetkishni alıp taslaw arqalı da bunı aldın alıw múmkin.

Соседние файлы в папке REFERAT