Raw Pointers এবং Dereferencing

Unsafe Rust (আনসেইফ রাস্ট) - রাস্ট (Rust) - Computer Programming

296

Rust-এ raw pointers হল একটি কমপাইল টাইমে সেফটি নিশ্চিত না করা পয়েন্টার, যা সি বা সি++ এর মত সিস্টেম প্রোগ্রামিং ভাষায় ব্যবহৃত হয়। এগুলি ডিরেক্ট মেমোরি অ্যাক্সেসের জন্য ব্যবহৃত হয়, তবে এগুলির সেফটি নিশ্চিত করার জন্য Rust-এর মালিকানা (ownership) বা বোরোউ (borrowing) সিস্টেম প্রয়োগ করা হয় না।

Raw pointers দুটি ধরনের হতে পারে:

  1. *const T: একটি কনস্ট্যান্ট রেফারেন্স (immutable raw pointer), যেটি মেমোরির মান পড়তে পারে কিন্তু পরিবর্তন করতে পারে না।
  2. *mut T: একটি মিউটেবল রেফারেন্স (mutable raw pointer), যা মেমোরির মান পড়তেও পারে এবং পরিবর্তনও করতে পারে।

এগুলো C/C++ এর মত সরাসরি মেমোরি অ্যাক্সেসের মতো কাজ করে, যেখানে ডিরেক্ট পয়েন্টিং এবং মেমোরি ম্যানিপুলেশন করা হয়। তবে Rust-এর raw pointers মূলত unsafe ব্লকের মধ্যে ব্যবহার করা হয়, কারণ এগুলির মাধ্যমে মেমোরি সেফটি এবং অন্যান্য সিস্টেমের সুরক্ষা চ্যালেঞ্জ হতে পারে।

Raw Pointers তৈরি করা

Raw pointers তৈরি করতে আপনাকে Rust এর unsafe ব্লক ব্যবহার করতে হবে, কারণ এই পয়েন্টারগুলি কম্পাইল টাইমে সেফটি চেক করে না। এটি নিশ্চিত করতে পারে না যে, মেমোরি সঠিকভাবে ব্যবহৃত হচ্ছে।

fn main() {
    let x = 10;
    let r: *const i32 = &x; // *const i32 একটি raw pointer, কেবলমাত্র পড়া যাবে

    unsafe {
        println!("Value of x through raw pointer: {}", *r); // ডিরেফারেন্স করা হয়েছে unsafe ব্লকে
    }
}

এখানে, r একটি raw pointer এবং unsafe ব্লকের মধ্যে *r দিয়ে মেমোরির মান অ্যাক্সেস করা হয়েছে।

Raw Pointers এবং Dereferencing

Dereferencing হল একটি পয়েন্টারের মাধ্যমে মেমোরি লোকেশন থেকে মান অ্যাক্সেস করা। Rust-এ সাধারণ পয়েন্টার ডিরেফারেন্স করতে সরাসরি * অপারেটর ব্যবহার করা হয়। তবে raw pointers-এ, আপনাকে ডিরেফারেন্স করার সময় unsafe ব্লক ব্যবহার করতে হয়, কারণ raw pointers সেফটি গ্যারান্টি দেয় না এবং তারা unsafe ডিরেক্ট মেমোরি অ্যাক্সেসের কাজ করে।

Raw Pointer Dereferencing

fn main() {
    let x = 42;
    let r: *const i32 = &x; // raw pointer তৈরি করা

    unsafe {
        println!("Dereferenced value: {}", *r); // unsafe ব্লকের মধ্যে raw pointer ডিরেফারেন্স করা
    }
}

এখানে, *r দ্বারা raw pointer ডিরেফারেন্স করা হচ্ছে। এটি unsafe ব্লকের মধ্যে করা হয়েছে কারণ raw pointer ডিরেফারেন্স করাটা সেফ নয় এবং এটা রানটাইমে পয়েন্টার ম্যানিপুলেশন করতে পারে, যার ফলে একাধিক সমস্যা তৈরি হতে পারে (যেমন ড্যাংলিং পয়েন্টার, মেমোরি লিক ইত্যাদি)।

Mutable Raw Pointers

যদি আপনি raw pointer এর মাধ্যমে ডেটা পরিবর্তন করতে চান, তাহলে mutable raw pointer ব্যবহার করতে হবে।

fn main() {
    let mut x = 10;
    let r: *mut i32 = &mut x; // mutable raw pointer তৈরি করা

    unsafe {
        *r = 20;  // mutable raw pointer ব্যবহার করে মান পরিবর্তন করা
        println!("New value of x: {}", *r);
    }
}

এখানে, r একটি mutable raw pointer যা *r দিয়ে ডিরেফারেন্স করা এবং মেমোরির মান পরিবর্তন করা হয়েছে।


Unsafe ব্লক এবং Raw Pointers

Raw pointers শুধুমাত্র unsafe ব্লকের মধ্যে ব্যবহার করা যায়। এই নিরাপত্তাহীন কোড অংশের কারণে ডেভেলপারকে অবশ্যই নিশ্চিত করতে হবে যে, তারা যে মেমোরি অ্যাক্সেস করছে তা সঠিক এবং নিরাপদ, অন্যথায় প্রোগ্রামটি ক্র্যাশ হতে পারে।

fn main() {
    let x = 5;
    let r: *const i32 = &x;

    unsafe {
        println!("Dereferenced value: {}", *r);
    }
}

এখানে, unsafe ব্লকের মধ্যে raw pointer ডিরেফারেন্স করা হয়েছে। এর মাধ্যমে Rust নিশ্চিত করতে পারে না যে এটি সেফ কিনা, সুতরাং ডেভেলপারকে নিশ্চিত হতে হবে যে, raw pointer ব্যবহার করার সময় মেমোরি অ্যাক্সেস সঠিকভাবে ঘটছে।


Raw Pointer এর বিপদ

  1. দ্বন্দ্বপূর্ণ ডেটা রেফারেন্স: যদি একাধিক raw pointer একই মেমোরি অ্যাড্রেসে পয়েন্ট করে, তাহলে তা ডেটা রেস বা অবৈধ মেমোরি অ্যাক্সেস সৃষ্টি করতে পারে।
  2. ড্যাংলিং পয়েন্টার: যদি raw pointer কোন ভ্যালিড মেমোরি লোकेশন পয়েন্ট না করে (যেমন যখন একটি ভ্যারিয়েবল মুছে ফেলা হয়), তখন এটি ড্যাংলিং পয়েন্টার হয়ে যায় এবং অপ্রত্যাশিত ফলাফল তৈরি করতে পারে।
  3. মেমোরি লিক: unsafe কোডে যথাযথ মেমোরি ব্যবস্থাপনা না করলে মেমোরি লিকও হতে পারে।

সারাংশ

Rust-এ raw pointers হল সিস্টেম প্রোগ্রামিংয়ের জন্য উপযুক্ত, যেগুলি ডিরেক্ট মেমোরি অ্যাক্সেস করতে সাহায্য করে, কিন্তু এগুলি unsafe ব্লকের মধ্যে ব্যবহার করা হয়। *const T এবং *mut T raw pointers দিয়ে আপনি একটি ভ্যারিয়েবলের মেমোরি অ্যাক্সেস করতে পারেন, তবে তাদের মাধ্যমে মেমোরি সেফটি নিশ্চিত করা হয় না। Dereferencing raw pointers-এ unsafe ব্লক ব্যবহারের মাধ্যমে করা হয়, কারণ এভাবে ডিরেফারেন্স করাটা সেফ নয়। raw pointers এবং unsafe কোড ব্যবহারের সময় ডেভেলপারকে সতর্ক থাকতে হয়, কারণ এটি সিস্টেমের সুরক্ষা এবং স্থিতিশীলতার জন্য বিপদজনক হতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...