หากคุณไม่ทราบขนาดที่แน่นอนของหน่วยความจำที่คุณต้องใช้คุณต้องมีการจัดสรรแบบไดนามิก ( malloc
) ตัวอย่างอาจเกิดขึ้นเมื่อผู้ใช้เปิดไฟล์ในแอปพลิเคชันของคุณ คุณจะต้องอ่านเนื้อหาของไฟล์ลงในหน่วยความจำ แต่แน่นอนว่าคุณไม่ทราบขนาดของไฟล์ล่วงหน้าเนื่องจากผู้ใช้เลือกไฟล์ตรงจุดขณะรันไทม์ โดยพื้นฐานแล้วคุณต้องใช้malloc
เมื่อคุณไม่ทราบขนาดของข้อมูลที่คุณกำลังทำงานอยู่ล่วงหน้า malloc
อย่างน้อยนั่นคือหนึ่งในเหตุผลหลักสำหรับการใช้ ในตัวอย่างของคุณด้วยสตริงธรรมดาที่คุณทราบขนาดของเวลาคอมไพล์แล้ว (และคุณไม่ต้องการแก้ไข) การจัดสรรแบบไดนามิกนั้นไม่สมเหตุสมผล
เล็กน้อยปิดหัวข้อ แต่ ... malloc
คุณจะต้องระมัดระวังไม่ให้สร้างหน่วยความจำรั่วเมื่อใช้ พิจารณารหัสนี้:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
if ( ) return -1;
free(someMemory);
return result;
}
คุณเห็นอะไรผิดปกติกับรหัสนี้หรือไม่? มีคำสั่งส่งคืนตามเงื่อนไขระหว่างmalloc
และfree
และตอนแรกมันอาจจะดูโอเค แต่ลองคิดดู หากมีข้อผิดพลาดคุณจะกลับมาโดยไม่ปล่อยหน่วยความจำที่คุณจัดสรรให้ นี่เป็นสาเหตุทั่วไปของการรั่วไหลของหน่วยความจำ
แน่นอนว่านี่เป็นตัวอย่างที่ง่ายมากและง่ายมากที่จะเห็นข้อผิดพลาดที่นี่ แต่ลองนึกภาพโค้ดหลายร้อยบรรทัดที่เกลื่อนไปด้วยพอยน์เตอร์malloc
sfree
s และการจัดการข้อผิดพลาดทุกประเภท สิ่งต่างๆอาจยุ่งเหยิงเร็วมาก นี่เป็นหนึ่งในเหตุผลที่ฉันชอบ C ++ ที่ทันสมัยมากกว่า C ในกรณีที่เกี่ยวข้อง แต่นั่นเป็นหัวข้อสำคัญทั้งหมด
ดังนั้นเมื่อใดก็ตามที่คุณใช้malloc
โปรดตรวจสอบให้แน่ใจเสมอว่าหน่วยความจำของคุณมีแนวโน้มที่จะfree
d มากที่สุด
malloc()
สามารถล้มเหลวได้!