Memory ownership — xotiradagi obyektning yashash muddatini qaysi kod boshqarishi va uni qachon bo‘shatishga mas’ul ekanini belgilovchi modeldir. U qiymatga kim murojaat qilishi mumkinligi bilan bog‘liq, ammo aynan bir narsa emas: ko‘p reader obyektni borrow qilishi mumkin, ownership esa baribir bitta egada qoladi. Aniq model leak, use-after-free va double free xavfini kamaytiradi.
Yagona egaga asoslangan model
Yagona ownership’da obyektni yaratgan scope yoki container uni yo‘q qiladi. Ownership boshqa functionga move qilinsa, eski egadan foydalanish taqiqlanadi. RAII usulida resource lifetime stack’dagi owner obyekt lifetime’iga bog‘lanadi; scope exception bilan tugasa ham destructor xotira, fayl yoki lockni tozalaydi.
Rust compiler ownership va borrowing qoidalarini statik tekshiradi. Bir vaqtda bitta mutable reference yoki bir nechta immutable reference bo‘lishi data race’ning katta sinfini compile time’da to‘xtatadi. C++ unique_ptr shu modelning library darajasidagi ko‘rinishini beradi, lekin raw aliaslar uchun compiler to‘liq kafolat bermaydi.
Umumiy ownership
Obyekt mustaqil consumerlar orasida yashasa reference counting ishlatilishi mumkin. Har owner countni oshiradi, ketganda kamaytiradi; nol bo‘lganda obyekt tozalanadi. Atomic counter threadlar orasida qimmatroq. Eng katta muammo cycle: A B’ni, B A’ni owner sifatida ushlasa count hech qachon nol bo‘lmaydi.
Weak reference cycle’ni uzatadi va obyekt tirikligini tekshirib vaqtinchalik strong reference oladi. “Observer” va “owner” aloqalari dizaynda ajratiladi. Har pointerni shared qilish mas’uliyatni yashiradi va resource qachon yopilishini noaniq qiladi.
Garbage collection
Garbage-collected runtime reachability asosida foydalanilmaydigan obyektni topadi. Developer free chaqirmaydi, ammo logical leak baribir mumkin: global cache yoki listener keraksiz obyektga reference saqlab turadi. Fayl descriptor, socket va lock kabi tashqi resurslar GC finalizeriga qoldirilmaydi, chunki collection vaqti deterministik emas; explicit close yoki scope construct ishlatiladi.
API shartnomasi
Native API parameteri borrowedmi, ownershipni oladimi yoki yangi owner qaytaradimi aniq yoziladi. Allocator chegarasi ham muhim: bir runtime ajratgan xotirani boshqa runtime noto‘g‘ri usulda bo‘shatmasligi kerak. FFI’da create/destroy juftligi va opaque handle barqaror contract beradi.
Concurrency ownershipni thread safety bilan bog‘laydi. Obyekt boshqa threadga ko‘chirilgach eski thread undan foydalanmasligi yoki synchronization talab qilinishi mumkin. Static analysis, leak detector va sanitizer testlarni to‘ldiradi. Review’da allocation joyidan tashqari error path, early return va cancel paytida owner kimligi tekshiriladi.
Arena va region modeli
Ko‘p mayda obyekt bir vazifa davomida birga yashasa arena allocator ularni bitta regiondan ajratadi va vazifa tugaganda hammasini birdan bo‘shatadi. Bu individual allocation xarajatini kamaytiradi hamda ownershipni “request arena”ga bog‘laydi. Biroq arena’dan tashqariga pointer chiqsa region tugagach dangling reference yuz beradi. Uzoq yashaydigan qiymat nusxalanadi yoki alohida ownerga ko‘chiriladi. Pool qayta ishlatilganda eski maxfiy ma’lumot tozalanishi talab qilinishi mumkin. Memory budget arena maksimal hajmini cheklaydi; aks holda bitta request juda ko‘p vaqtinchalik obyekt yaratib processni xotirasiz qoldiradi.
Ownership diagrammasi async task va callbacklarni ham qamrab oladi. Cancel qilingan task reference’ni queue’da saqlab qolsa obyekt kutilganidan uzoq yashaydi. Shutdown ketma-ketligi yangi ishni to‘xtatib, mavjud borrowlar tugagach ownerni yopadi.
Bog‘liq tushunchalar
RAII, Borrowing, Garbage collection, Reference counting, Smart pointer, Use-after-free, Resource lifetime