alloc, free, create, destroy
การดำเนินการหลักของตัวจัดสรร
alloc, free, create, destroy เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
การดำเนินการหลักสี่อย่าง
ตัวจัดสรรหน่วยความจำมีการเรียกใช้สำคัญสี่แบบ: alloc และ free สำหรับหลายรายการ ส่วน create และ destroy สำหรับค่าเดียว
alloc คืนค่าเป็นสไลซ์
ใช้ alloc เพื่อขอพื้นที่สำหรับรายการต่อเนื่อง คุณส่งชนิดของสมาชิกและจำนวนเข้าไป แล้วจะได้รับสไลซ์ที่มีสมาชิกจำนวนนั้นกลับมา
const buf = try a.alloc(u8, 64);alloc อาจล้มเหลว
เนื่องจากฮีปอาจไม่มีพื้นที่เหลือ alloc จึงคืนค่าเป็นสหภาพข้อผิดพลาด คีย์เวิร์ด try จะจัดการกรณี OutOfMemory ให้คุณอย่างเรียบร้อย
const list = try a.alloc(i32, 10);free คืนหน่วยความจำ
เมื่อใช้งานเสร็จแล้ว ให้เรียก free พร้อมสไลซ์เดียวกับที่ได้รับมา หากลืมทำเช่นนี้ GeneralPurposeAllocator จะแจ้งว่ามีหน่วยความจำรั่ว
a.free(buf);defer free ทันที
แนวปฏิบัติทั่วไปคือเขียน defer a.free ทันทีหลังจาก alloc สำเร็จ เพื่อให้การล้างทรัพยากรเกิดขึ้นไม่ว่าขอบเขตการทำงานจะสิ้นสุดอย่างไร
const buf = try a.alloc(u8, 64);
defer a.free(buf);create สำหรับค่าเดียว
เมื่อคุณต้องการค่าบนฮีปเพียงค่าเดียว ให้ใช้ create โดยรับชนิดข้อมูลและคืนพอยน์เตอร์ไปยังหน่วยความจำใหม่สำหรับหนึ่งรายการ
const node = try a.create(Node);เขียนค่าผ่านพอยน์เตอร์
create ให้ พอยน์เตอร์ แก่คุณ ดังนั้นให้กำหนดค่าผ่านพอยน์เตอร์ด้วย .* ก่อนใช้ข้อมูลที่พอยน์เตอร์นั้นชี้อยู่
node.* = Node{ .value = 42 };destroy พอยน์เตอร์
คืนค่าที่สร้างด้วย destroy โดยส่งพอยน์เตอร์เดียวกับที่ create คืนมาให้ การเรียกใช้นี้เป็นคู่กับ create
a.destroy(node);จับคู่ให้ถูกต้อง
กฎนี้เคร่งครัด: alloc ต้องคู่กับ free และ create ต้องคู่กับ destroy ห้ามจับคู่ข้ามกันหรือ free สไลซ์ที่คุณไม่ได้จัดสรร
free ด้วยตัวจัดสรรตัวเดิม
ให้คืนหน่วยความจำโดยใช้ตัวจัดสรร ตัวเดียวกันกับที่สร้างหน่วยความจำนั้นเสมอ การใช้ตัวจัดสรรปะปนกันทำให้ข้อมูลเสียหาย ซึ่งคอมไพเลอร์ตรวจจับไม่ได้
ข้อผิดพลาดจะข้ามส่วนของ defer
หาก alloc ล้มเหลว ก็ไม่มีการสร้างหน่วยความจำ จึงไม่มีสิ่งใดต้องคืน นั่นเป็นเหตุผลที่ต้องเขียน defer free หลังจาก alloc สำเร็จ ✅
ตรวจสอบความเข้าใจอย่างรวดเร็ว
จับคู่การเรียกจัดสรรแต่ละแบบกับการเรียกคืนหน่วยความจำที่ถูกต้อง
สรุป
คุณได้เรียนรู้คู่การเรียกใช้งานแล้ว: alloc/free สำหรับสไลซ์ และ create/destroy สำหรับค่าเดียว โดยต้องคืนหน่วยความจำด้วยตัวจัดสรรตัวเดิมเสมอ 🎯
คำถามที่พบบ่อย
บทเรียน “alloc, free, create, destroy” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “alloc, free, create, destroy” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Zig Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “alloc, free, create, destroy”
การดำเนินการหลักของตัวจัดสรร คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Zig Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Zig Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “alloc, free, create, destroy” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Zig Academy นี้ได้ไหม
ได้ บทเรียน Zig Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใด Zig จึงไม่มีการจัดสรรที่ซ่อนอยู่
- ส่วนติดต่อสำหรับตัวจัดสรร
- alloc, free, create, destroy
- รายการแบบไดนามิกด้วย ArrayList