RAII жана ресурстарды башкаруу
Ар бир ресурсту объекттин жашоо мөөнөтүнө байлаңыз
- ресурс деген эмне жана эмне үчүн агып кетүү болорун түшүндүрө аласыз,
- ресурсту конструктор жана деструктор аркылуу объектке байлай аласыз,
- үчтүн эрежесин жана бештин эрежесин колдоно аласыз,
- акылдуу көрсөткүчтөр жана контейнерлер менен нөлдүн эрежесин колдоно аласыз.
1. Ресурс деген эмне жана эмне үчүн агып кетүү болот?
Ресурс — бул программаңыз системадан алып, акырында кайтарууга милдеттүү болгон бардык нерсе: new аркылуу үймөктөн алынган эстутум, ачык файл дескриптору, тармак сокети, маалымат базасынын байланышы, мьютекс кулпусу. Схема ар дайым бирдей: алуу, колдонуу, андан кийин бошотуу. Бошотууну унутсаңыз, агып кетүү пайда болот — ресурсту эч ким колдонбосо да, ал ээленген бойдон калат.
Кол менен тазалоо оңой сыяктуу көрүнөт, чыныгы код тоскоол болгонго чейин:
void process() {
int* data = new int[1000]; // алуу
if (!load(data)) {
return; // АГЫП КЕТҮҮ: бул жолдо delete[] унутулду
}
compute(data);
delete[] data; // бошотуу (бир гана ийгиликтүү жолдо)
}
Эрте return delete[] дегенди өткөрүп жиберет. Андан да жаманы, эгерде compute() өзгөчө жагдай ыргытса, delete[] сабы такыр аткарылбайт. Ар бир тармак, ар бир өзгөчө жагдай, ар бир келечектеги оңдоо — агып кетүүнүн мүмкүнчүлүгү. RAII адамды бул чынжырдан алып салат.