Ownership
Rust mein har value ka ek waqt par exactly ek hi owner hota hai. Jab owner scope se bahar jaata hai, value khud ba khud drop ho jaati hai (uski memory free ho jaati hai) — koi garbage collector nahi, koi manual free() nahi. Yehi ek rule hai jo Rust ko memory safety ko poori tarah compile time par hi guarantee karne deta hai.
Copy types vs. moves
i32 jaise simple types Copy trait implement karte hain, isliye ek variable ko doosre ko assign karna bas value ko copy kar deta hai — dono independently usable rehte hain.
fn main() {
let x = 5;
let y = x; // i32 is Copy, so x is still valid
println!("x = {}, y = {}", x, y);
}x = 5, y = 5
Ek String, Copy implement nahi karta, kyunke woh heap-allocated data ko own karta hai. s1 ko s2 mein assign karna ownership move kar deta hai — iske baad s1 valid nahi rehta, jo baad mein dono variables ko same memory free karne ki koshish karne se bachata hai.
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1 is moved into s2
println!("{}", s2);
}hello
Ek real move error kaisa dikhta hai
Yeh waqai woh hai jo rustc report karta hai jab aap ek moved value ko istemal karne ki koshish karte hain — ek real run se capture kiya gaya hai, plausible dikhne ke liye likha nahi gaya:
fn main() {
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
}error[E0382]: borrow of moved value: `s1`
--> main.rs:5:28
|
2 | let s1 = String::from("hello");
| -- move occurs because `s1` has type `std::string::String`, which does not implement the `Copy` trait
3 | let s2 = s1;
| -- value moved here
4 |
5 | println!("{}, world!", s1);
| ^^ value borrowed here after move
error: aborting due to previous error
For more information about this error, try `rustc --explain E0382`.Kuch bhi nahi chalta — koi output nahi, bas error. Yehi poora point hai: Rust ek would-be use-after-free ko compile time par hi pakar leta hai, ek aisi language mein jahan agar yeh slip ho jaata to saaf karne ke liye koi garbage collector nahi hota.
Aage: references aur borrowing — ownership liye baghair ek value ko kaise istemal karein.
Practice Exercise
Ek String name = String::from("Alice") banayein. Use ek naye variable owner mein move karein, phir owner (name nahi) print karein.