Санах ой болон заагч

Бид бүхэн array, vector зэргийг хэрхэн үүсгэх ашиглаж болох талаар ярилцсан. Гэхдээ эдгээр зүйлс нь цаанаа хэрхэн дүрслэгддэг талаар ойлголт байхгүй байгаа билээ. Үүний тухай бичье.

Мэдээж эдгээр бүх хувьсагч санах ойд хадгалагддаг. Жишээ нь бид array, vector үүсгэх үед c++ нь санах ойд үүсгэж бид шууд ашиглах боломжтой болдог. Хэрвээ бид эдгээр хувьсагчийг ашиглахгүй бол, эдгээр нь шууд цэвэрлэгдээд явдаг. Жишээ нь функц дотор зарласан хувьсагч шиг. Эдгээр хувьсагчийг хэрхэн санах ойн аль хэсэгт байгааг мэдэх вэ? Үүнийг бид заагч ашиглан олох боломжтой. Хувьсагчийн санах ойн хаягийг & тэмдэгт тавин мэддэг.

    int n = 19;
    int *pointer_n = &n;

Дээрх жишээн дээр pointer_n-нь n гэсэн хувьсагчийн санах ойн хаягийг хадгалж байна. Хэрвээ бид pointer_n-ны зааж байгаа хаягийн утгыг өөрчилбөл мэдээж n хувьсагчийн утга өөрчлөгдөнө.

Image

Энэхүү зурагт харж байгаашиг pointer_n-нь санах ойн хаяг хадгалдаг хувьсагч бөгөөд одоогийн байдлаар n хувьсагчийн санах ойн хаягийг заасан байна.

    int a[4];
    a[0] = 12;
    int *p = a;

Энэхүү жишээн дээр a гэсэн array-н санах ойн хаягийг p заагч хадгалж байгаа бөгөөд энэ хаяг нь тухайн array-н эхлэлийн хаяг байна. Эхлэлийн хаягийг мэдэж байгаа тул ямарч элементийн хаягийг мэдэж байгаатай адилхан билээ.

Image

Dynamic Memory Management

C++ хэлдээр бид бүхэн өөрийн хүссэнээрээ санах ойгоо удирдах боломжтой. new гэсэн operator ашиглан бид шинээр санах ой үүсгэдэг ба энэ нь тухайн шинэ санах ойн эхний хаягийг буцаана.

    int *n = new int;
    *n = 13;
    cout << n << " " << *n << endl; 
    delete n;

Энэхүү жишээндээр бид n гэсэн заагчид өөрсдийн үүсгэсэн санах ойн хаягийг хадгалж байгаа бөгөөд үүнийгээ бид хянах, устгах шаардлагатай.

    int *n = new int[10];
    *n[0] = 1;
    delete[] n;

Энэхүү жишээн дээр бид 10 ширхэг int-н санах ой үүсгэж байгаа ба эхний санах ойн хаягийг n гэсэн заагчид хадгалж байна. Бид int төрлийн 10 ширхэг тоо үүсгэсэн гэдгээ мэдэж байгаа тул дурын элемэнт рүү шууд хандаж чадна.

Яагаад

Ямар ч гэсэн санах ойг өөрсдийн дураараа удирдах боломжтой байх нь ээ. Гэхдээ ингэх ямар шаардлагатай вэ? Учир нь зарим өгөгдлийн бүтэц болон асуудлыг өөрсдөө санах ойгоо удирдаж хийснээр илүү хялбар давуу талтай болдог ба энэ тухай дараа бичих болно. Мэдээж бид өөрсдөө үүсгэсэн учир хянах, устгах нь бидний асуудал болох ба энэ нь том систем дээр санах ойн аюулгүй байдлыг хангахад асуудал үүсгэх боломжтой. Java, Go, Python гэх мэт хэлүүд дээр санах ойг garbage collector ашиглан хянаж цэвэрлэдэг нь илүү аюул багатай болгож байгаа ч нэмэлт зүйл ажиллах хэрэгтэй болдог. Харин rust гэх мэт хэлүүд дээр санах ойг borrow, checker гэсэн ойлголт гаргаж ирснээр аюулгүй нэмэлт зүйлгүйгээр хянах цэвэрлэх боломжийг үүсгэдэг. Энэ тухай дараа дэлгэрэнгүй бичих болноо.