[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-rust-ownership-memory-management-ep7-all--*":3,"academy-blog-translations-ce57lvevpczp1sj":83},{"data":4,"page":82,"perPage":82,"totalItems":82,"totalPages":82},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":76,"keywords":77,"locale":52,"published_at":13,"scheduled_at":13,"school_blog":74,"short_description":78,"slug":79,"status":72,"title":80,"updated":81,"updated_by":13,"views":75},"ภาพประกอบบทความ Rust The Series EP.7 สอนเรื่อง Ownership และการจัดการ Memory","sclblg987654321","school_blog_translations","\u003Cp>ยินดีต้อนรับกลับเข้าสู่ \u003Cstrong>Rust The Series\u003C\u002Fstrong> ครับ! ใน EP.6 เราได้เรียนรู้วิธีควบคุมทิศทางของโปรแกรมด้วย Control Flow กันไปแล้ว วันนี้เราจะมาก้าวเข้าสู่ \u003Cstrong>\"หัวใจสำคัญที่สุด\"\u003C\u002Fstrong> ของภาษา Rust กันครับ\u003C\u002Fp>\u003Cp>ถ้าถามว่าอะไรคือสิ่งที่ทำให้ Rust โดดเด่นและแตกต่างจากภาษาฮิตๆ อย่าง C++, Java, Go หรือ Python? คำตอบสั้นๆ คำเดียวเลยคือ \u003Cstrong>Ownership (กฎแห่งการครอบครอง)\u003C\u002Fstrong> ครับ!\u003C\u002Fp>\u003Cp>ระบบนี้คือไม้ตายก้นหีบที่ทำให้ Rust สามารถจัดการหน่วยความจำ (Memory) ได้อย่างมีประสิทธิภาพระดับ C\u002FC++ แต่ที่เจ๋งกว่าคือมันช่วยรับประกันว่า \u003Cstrong>\"จะไม่เกิดบั๊ก\"\u003C\u002Fstrong> ประเภท Memory Leak หรือจัดการ Memory พลาดจนโปรแกรมพัง และที่สำคัญที่สุด... มันทำงานได้โดย \u003Cstrong>ไม่ต้องมี Garbage Collector (GC)\u003C\u002Fstrong> มาคอยหน่วงให้โปรแกรมช้าลง!\u003C\u002Fp>\u003Cp>ระบบที่ฟังสเปคดูเหมือนเวทมนตร์นี้ ทำงานเบื้องหลังยังไง? เพื่อไม่ให้เป็นการเสียเวลา เรามาเจาะลึก \u003Cstrong>กฎเหล็ก 3 ข้อของ Ownership\u003C\u002Fstrong> กันเลยครับ!\u003C\u002Fp>\u003Ch2>1. กฎเหล็ก 3 ข้อของ Ownership\u003C\u002Fh2>\u003Cp>ในโลกของ Rust เพื่อให้โปรแกรมสามารถจัดการ Memory ได้เองตั้งแต่ตอนคอมไพล์ คุณต้องจำกฎ 3 ข้อนี้ให้ขึ้นใจครับ:\u003C\u002Fp>\u003Col>\u003Cli>\u003Cp>\u003Cstrong>ข้อมูลทุกชิ้น\u003C\u002Fstrong> ใน Rust จะต้องมีตัวแปรที่เป็น \u003Cstrong>\"เจ้าของ\" (Owner)\u003C\u002Fstrong>\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ในเวลาใดเวลาหนึ่ง ข้อมูลชิ้นหนึ่ง จะมี \u003Cstrong>\"เจ้าของได้เพียงคนเดียวเท่านั้น\"\u003C\u002Fstrong>\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>เมื่อตัวแปรที่เป็นเจ้าของ \u003Cstrong>\"หลุดออกจากขอบเขตการทำงาน\" (Out of scope)\u003C\u002Fstrong> ข้อมูลนั้นจะถูกเคลียร์ทิ้งจาก Memory ทันที!\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003Ch2>2. ขอบเขตการทำงาน (Scope) และการทำลายทิ้ง (Drop)\u003C\u002Fh2>\u003Cp>ลองมาดูตัวอย่างง่ายๆ ของคำว่า Scope กันครับ ในภาษา Rust \u003Cstrong>ปีกกา \u003Ccode>{}\u003C\u002Fcode> คือตัวกำหนดขอบเขตชีวิตของตัวแปร\u003C\u002Fstrong> เพื่อให้เห็นภาพการจองและคืน Memory ชัดเจน เราจะใช้ \u003Ccode>String::from\u003C\u002Fcode> ซึ่งเป็นการสร้างข้อมูลบน Heap Memory ครับ:\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\n    {                      \u002F\u002F s ยังไม่เกิด เพราะยังไม่ถูกประกาศ\n        let s = String::from(\"hello\");   \u002F\u002F s เกิดขึ้น และจองพื้นที่บน Heap ตั้งแต่บรรทัดนี้\n        println!(\"{}\", s);\n    }                      \u002F\u002F &lt;--- จบ Scope! ตัวแปร s จะถูกทำลายทิ้ง (เรียกใช้ฟังก์ชัน Drop) คืน Memory ให้ระบบทันที\n    \n    \u002F\u002F println!(\"{}\", s);  \u002F\u002F ❌ ถ้าฝืนเรียกใช้ s ตรงนี้ คอมไพเลอร์จะด่าทันที เพราะ s ตายไปแล้ว!\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>สังเกตไหมครับว่า ทันทีที่ปิดปีกกา \u003Ccode>}\u003C\u002Fcode> Rust จะรู้หน้าที่และทำการคืน Memory ให้เราอัตโนมัติ โดยที่เราไม่ต้องสั่ง Free Memory เองเลย นี่แหละครับความยอดเยี่ยมของมัน!\u003C\u002Fp>\u003Ch2>3. การย้ายสิทธิ์ความเป็นเจ้าของ (Move)\u003C\u002Fh2>\u003Cp>กฎข้อที่ 2 บอกไว้ชัดเจนว่า \u003Cstrong>\"มีเจ้าของได้แค่คนเดียว\"\u003C\u002Fstrong> ลองมาสัมผัสความเจ็บปวดแรกของคนเริ่มเขียน Rust กันครับ สมมติเราใช้ชนิดข้อมูลแบบ \u003Ccode>String\u003C\u002Fcode> (ซึ่งเก็บข้อมูลตัวจริงไว้บน Heap Memory)\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\n    let s1 = String::from(\"Superdev\");\n    let s2 = s1; \u002F\u002F เกิดการ \"ย้าย\" (Move) สิทธิ์ความเป็นเจ้าของจาก s1 ไปที่ s2 ทันที\n\n    \u002F\u002F println!(\"ค่าของ s1 คือ {}\", s1); \u002F\u002F ❌ บรรทัดนี้จะ Error ทันที!\n    println!(\"ค่าของ s2 คือ {}\", s2);    \u002F\u002F ✅ ทำงานได้ปกติ\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cstrong>เกิดอะไรขึ้น?\u003C\u002Fstrong> ในภาษาอื่น การทำแบบนี้คือการสร้าง Reference ให้ตัวแปรสองตัวชี้ไปที่ข้อมูลก้อนเดียวกัน แต่สำหรับ Rust เมื่อคุณประกาศ \u003Ccode>let s2 = s1;\u003C\u002Fcode> มันคือการ \u003Cstrong>\"ยึดอำนาจ\"\u003C\u002Fstrong> ครับ!\u003C\u002Fp>\u003Cp>สิทธิ์ความเป็นเจ้าของจะตกไปอยู่ที่ \u003Ccode>s2\u003C\u002Fcode> ทันที และตัวแปร \u003Ccode>s1\u003C\u002Fcode> จะถูกมองว่าเป็น \u003Cstrong>\"ตัวแปรที่ว่างเปล่า\" (Invalidated)\u003C\u002Fstrong> ไม่สามารถนำไปใช้งานต่อได้อีก\u003C\u002Fp>\u003Cp>\u003Cstrong>ทำไม Rust ต้องทำแบบนี้?\u003C\u002Fstrong> เพื่อป้องกันบั๊กร้ายแรงที่เรียกว่า \u003Cstrong>Double Free Error\u003C\u002Fstrong> ครับ ลองนึกภาพตามว่า ถ้า \u003Ccode>s1\u003C\u002Fcode> และ \u003Ccode>s2\u003C\u002Fcode> ชี้ไปที่ Memory ก้อนเดียวกัน ตอนที่ตัวแปรทั้งสองหลุด Scope มันจะพยายามลบ Memory ก้อนเดียวกันซ้ำสองครั้ง ซึ่งจะทำให้โปรแกรมพัง (Crash) ทันที! Rust จึงตัดไฟแต่ต้นลมด้วยการยึดสิทธิ์ \u003Ccode>s1\u003C\u002Fcode> ทิ้งไปซะเลย\u003C\u002Fp>\u003Ch2>4. ถ้าอยากก็อปปี้จริงๆ ล่ะ? (Clone)\u003C\u002Fh2>\u003Cp>ถ้าเรามีเหตุจำเป็นที่ไม่อยากย้ายสิทธิ์ (Move) แต่อยาก \u003Cstrong>\"คัดลอก\"\u003C\u002Fstrong> ข้อมูลออกมาเป็นอีกชุดแยกกันไปเลย (Deep Copy) เราจะใช้คำสั่ง \u003Ccode>.clone()\u003C\u002Fcode> เข้ามาช่วยครับ:\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\n    let s1 = String::from(\"Superdev\");\n    let s2 = s1.clone(); \u002F\u002F สร้างข้อมูลชุดใหม่ขึ้นมาใน Memory อีกก้อนให้ s2 เป็นเจ้าของ\n\n    println!(\"s1 = {}, s2 = {}\", s1, s2); \u002F\u002F ✅ ทำงานได้ทั้งคู่ เพราะเป็นคนละเจ้าของและใช้ Memory คนละก้อนกันแล้ว\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>🔥 \u003Cstrong>Rust Trick: ทำไมตัวเลขถึงไม่โดนยึดสิทธิ์?\u003C\u002Fstrong> ถ้าคุณลองทำแบบเดียวกันกับตัวเลข (Integer) คุณอาจจะแปลกใจที่มันดันรันผ่านเฉยเลย!\u003C\u002Fp>\u003Cp>Rust\u003C\u002Fp>\u003Cpre>\u003Ccode>fn main() {\n    let x = 5;\n    let y = x;\n    println!(\"x = {}, y = {}\", x, y); \u002F\u002F ✅ ทำงานได้! x ไม่โดนยึดสิทธิ์\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cstrong>ทำไมถึงเป็นแบบนั้น?\u003C\u002Fstrong> เหตุผลคือ ข้อมูลพื้นฐานที่มีขนาดตายตัว (Primitive types เช่น Integer, Float, Boolean, Char) จะถูกเก็บไว้ใน \u003Cstrong>Stack Memory\u003C\u002Fstrong> ครับ ซึ่งการก็อปปี้ข้อมูลบน Stack นั้นทำงานได้รวดเร็วและใช้ทรัพยากรน้อยมาก (ถูกมาก)\u003C\u002Fp>\u003Cp>Rust จึงทำการก็อปปี้ (Copy) ข้อมูลให้เราแบบอัตโนมัติเลย โดยไม่ต้องทำการย้ายสิทธิ์ (Move) แบบที่เกิดกับ String ครับ (พฤติกรรมเบื้องหลังการทำงานแบบนี้เรียกว่า \u003Cstrong>Copy Trait\u003C\u002Fstrong> ซึ่งเราจะไปเจาะลึกกันใน EP หลังๆ ครับ)\u003C\u002Fp>\u003Cp>\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>สรุป\u003C\u002Fh2>\u003Cp>Ownership คือแนวคิดที่ออกแบบมาเพื่อบังคับให้เราเขียนโค้ดที่ปลอดภัยตั้งแต่ตอนเขียน (Compile time) ช่วงแรกๆ คุณอาจจะรู้สึกว่า \"ทำไมคอมไพเลอร์มันดุจังวะ ย้ายค่านิดเดียวก็ Error\" แต่เชื่อเถอะครับว่า ถ้าคุณผ่านด่านคอมไพเลอร์ของ Rust ไปได้ โปรแกรมของคุณจะแข็งแกร่ง รันเร็ว และแทบไม่พบบั๊กตอนนำไปใช้งานจริง (Production) เลย!\u003C\u002Fp>\u003Cp>📌 \u003Cstrong>ใน EP. ถัดไป (EP.8):\u003C\u002Fstrong> ถ้าต้องมานั่ง \u003Ccode>.clone()\u003C\u002Fcode> ทุกครั้งที่ส่งค่าเข้าฟังก์ชัน Memory คงเต็มกันพอดี! เราจะมาดูวิธีแก้ปัญหานี้ด้วยการ \u003Cstrong>\"ยืม\" (Borrowing &amp; References)\u003C\u002Fstrong> เพื่อให้เราเอาข้อมูลไปใช้ได้โดยไม่ต้องแย่งสิทธิ์ความเป็นเจ้าของกัน เตรียมตัวให้พร้อม แล้วพบกันในบทความหน้าครับ 🦀\u003C\u002Fp>\u003Ch3>🎯 ติดตามความรู้สาย Dev แบบสุดจัดได้ที่:\u003C\u002Fh3>\u003Cp>ไม่อยากพลาดบทความเทคนิคเชิงลึกและอัปเดตใหม่ๆ จากเรา ติดตาม Superdev Academy ได้ทุกช่องทางที่นี่ครับ:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>🔵 \u003Cstrong>Facebook:\u003C\u002Fstrong> \u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">Superdev Academy Thailand\u003C\u002Fa> (อัปเดตข่าวสารและบทความใหม่)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>🎬 \u003Cstrong>YouTube:\u003C\u002Fstrong> \u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\">Superdev Academy Channel\u003C\u002Fa> (ติวเข้มแบบวิดีโอ)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>📸 \u003Cstrong>Instagram:\u003C\u002Fstrong> \u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">@superdevacademy\u003C\u002Fa> (เกร็ดความรู้สั้นๆ และเบื้องหลังการทำงาน)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>🎬 \u003Cstrong>TikTok:\u003C\u002Fstrong> \u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">@superdevacademy\u003C\u002Fa> (Tips &amp; Tricks ฉบับย่อยง่าย)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>🌐 \u003Cstrong>Website:\u003C\u002Fstrong> \u003Ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"http:\u002F\u002Fsuperdevacademy.com\">superdevacademy.com\u003C\u002Fa> (คลังบทความและคอร์สเรียนฉบับเต็ม)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>","13np38krtk6w_uu99ro35i4.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fzjq6mkdttnubtyt\u002F13np38krtk6w_uu99ro35i4.png","2026-04-17 07:41:25.849Z","",{"keywords":15,"locale":46,"school_blog":56},[16,23,28,33,37,41],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:20:06.235Z","254619mvnk1hr7y","Rust","2026-04-10 16:07:25.292Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-16 05:11:00.000Z","2ypk85up2gune0d","Ownership Rust","2026-04-10 16:14:42.143Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-23 03:08:18.875Z","pu1hva5rmnc4672","สอน Rust","2026-04-10 16:14:44.507Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":34,"updated_by":13},"2026-04-17 07:41:10.212Z","mxgbsh34gakme8i","Garbage Collector",{"collectionId":17,"collectionName":18,"created":38,"created_by":13,"id":39,"name":40,"updated":38,"updated_by":13},"2026-04-17 07:41:18.480Z","gye5gzd7bmbzwac","Memory Leak",{"collectionId":17,"collectionName":18,"created":42,"created_by":13,"id":43,"name":44,"updated":45,"updated_by":13},"2026-03-04 08:44:11.146Z","gms2qr4xg6qv65e","Superdev Academy","2026-04-10 16:12:41.207Z",{"code":47,"collectionId":48,"collectionName":49,"created":50,"flag":51,"id":52,"is_default":53,"label":54,"updated":55},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":57,"collectionId":58,"collectionName":59,"expand":60,"id":74,"views":75},"mfqe235iv6x1or8","pbc_2105096300","school_blogs",{"category":61},{"blogIds":62,"collectionId":63,"collectionName":64,"created":65,"created_by":13,"id":57,"image":66,"image_alt":13,"image_path":67,"label":68,"name":69,"priority":70,"publish_at":71,"scheduled_at":13,"status":72,"updated":73,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-16 04:40:07.104Z","47vt5s1gglj_tz0b90vnge.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fmfqe235iv6x1or8\u002F47vt5s1gglj_tz0b90vnge.png",{"en":69,"th":69},"Rust The Series",2,"2026-03-16 04:40:09.199Z","published","2026-04-25 02:32:15.619Z","ce57lvevpczp1sj",118,"zjq6mkdttnubtyt",[20,25,30,35,39,43],"เรียนรู้หัวใจสำคัญของภาษา Rust กับกฎ Ownership 3 ข้อ ที่ทำให้โปรแกรมของคุณทำงานเร็วสุดขั้ว ปลอดภัยจาก Memory Leak โดยไม่ต้องพึ่งพา Garbage Collector","rust-ownership-memory-management-ep7","ไขความลับ Ownership กฎเหล็กที่ทำให้ Rust เร็วและปลอดภัยไม่ง้อ GC | Rust The Series EP.7","2026-04-21 04:11:31.847Z",1,{"th":79,"en":79}]