Ownership
Rust mein har value ka ek time par exactly ek hi owner hota hai. Jab owner scope se bahar jaata hai, value automatically drop ho jaati hai (uski memory free ho jaati hai) — koi garbage collector nahi, koi manual free() nahi. Yahi 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, kyunki 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 genuinely woh hai jo rustc report karta hai jab aap ek moved value ko use karne ki koshish karte ho — 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 run nahi hota — koi output nahi, bas error. Yahi poora point hai: Rust ek would-be use-after-free ko compile time par hi pakad 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 bina ek value ko kaise use karein.
Practice Exercise
Ek String name = String::from("Alice") banao. Use ek naye variable owner mein move karo, phir owner (name nahi) print karo.