Junior
Ինչու՞ օգտագործել հղումը ավելի անվտանգ է փոփոխություններից պաշտպանվելու համար, քան ցուցիչը։
sobes.tech AI
Պատասխան AI-ից
Հղումը միշտ պետք է հղվի առկա օբյեկտի և չի կարող լինել nullptr։ Ցկանցողը կարող է լինել nullptr կամ հղում անի անվավեր հիշողությանը։ Երբ dereference է կատարվում nullptr կամ անվավեր ցկանցողով, առաջանում է անորոշ վարք (հաճախ հիշողության սեգմենտացիա), որը ավելի դժվար է հայտնաբերել։ Հղումը երաշխավորում է, որ աշխատում եք վավեր օբյեկտի հետ։
// Ցկանցողի օգտագործում
int* ptr = nullptr;
// Փորձը dereference անել կարող է հանգեցնել սխալի
// *ptr = 10;
// Հղման օգտագործում
int value = 5;
int& ref = value; // Հղումը սկսվում է առկա օբյեկտով
// *ref = 10; // Սխալ սինտաքս - ref արդեն `value`-ի հոմանիշն է
ref = 10; // Փոխում է `value`-ը հղման միջոցով - անվտանգ
// Հղումը չի կարող լինել `nullptr`
// int& invalid_ref = nullptr; // Կոմպիլյատորային սխալ
Հղումը պետք է սկզբում լինի հայտարարության ժամանակ, հղում անելով կոնկրետ օբյեկտին, և չի կարող փոխվել այլ օբյեկտի վրա։ Ցկանցողը կարող է փոխվել՝ ցույց տալով տարբեր օբյեկտների կամ nullptr-ի վրա։
// Ցկանցողի օգտագործում
int a = 1;
int b = 2;
int* ptr = &a; // Ցկանցող a-ի վրա
ptr = &b; // Այժմ ցկանցողը ցույց է տալիս b-ին
Անվտանգության տեսանկյունից հիմնական տարբերությունները՝
| Հնարավորություն | Հղում | Ցկանցող |
|---|---|---|
Բոլոր nullptr-ներ |
Ոչ | Այո |
| Փոխառնել | Ոչ | Այո |
nullptr-ի dereference |
Անհնարին | Անորոշ վարք |
| Օգտագործել առանց սկզբնական արժեքի | Անհնարին (կոմպիլյատորային սխալ) | Մինչև dereference-ը՝ հնարավոր (անորոշ վարք) |