Just another WordPress.com site

ในโปรแกรมทุกโปรแกรมไม่ว่าในภาษาใดๆก็ตามนะครับ เมื่อเราทำการประกาศตัวแปรขึ้นมา เครื่องคอมพิวเตอร์ของเราจะทำการจับจองเนื้อที่หน่วยความจำของตัวแปรนั้นครับ เช่น ถ้าเราประกาศว่า

int x;

เครื่องคอมพิวเตอร์จะทำการจองหน่วยความจำขนาด 4 ไบต์(สำหรับข้อมูลชนิด int) ที่จะใช้เก็บตัวแปร x

ตัวแปรที่จองเนื้อที่ในหน่วยความจำ จะจองไว้อย่างนั้นจนกว่าเราจะออกจากฟังก์ชันนั้นๆ ครับ เช่น ถ้าเราสั่ง int x; ในฟังก์ชัน main ตัวแปร x ก็จะคงอยู่อย่างนั้นจนกระทั่งสิ้นสุดการทำงานของโปรแกรม(กล่าวคือออกจาก main) หรือ สมมติว่าเราประกาศ int y; ในฟังก์ชัน myFunction เมื่อเรามีการเรียกใช้ myFunction เครื่องคอมพิวเตอร์จะจองหน่วยความจำสำหรับตัวแปร y เมื่อการทำงานของ myFunction สิ้นสุดลงก็จะคืนหย่วยความจำที่จองให้กับตัวแปร y คืนให้กับคอมพิวเตอร์ของเรา

เพราะฉะนั้นการเขียนโปรแกรมคอมพิวเตอร์ เราควรจะแยกเป็นฟังก์ชันหลายๆฟังก์ชันครับ เพื่อที่ว่าตัวแปรที่เราไม่ได้ใช้งานจะทำการคืนหน่วยความจำให้กับเครื่องคอมพิวเตอร์ไปครับ ผมขอแนะนำว่าไม่ควรยัดทุกสิ่งทุกอย่างลงในฟังก์ชัน main ทั้งหมดครับ ไม่เช่นนั้นคอมพิวเตอร์ของเราจะทำงานหนักมากครับ โดยเฉพาะโปรแกรมที่มีการเรียกใช้ตัวแปรเยอะๆ

ในภาษา C++ มีคำสั่งที่ให้ผู้ใช้จองหน่วยความจำเองที่ชื่อว่า new รูปแบบคำสั่งจะเป็น

ชนิดข้อมูล pointer = new ชนิดข้อมูล;

เช่นเราสั่งว่า

int* p=new int;

เครื่องคอมพิวเตอร์จองหน่วยความจำขนาด 4 ไบต์(new int) เพื่อเก็บข้อมูลชนิด int แล้วให้ pointer p ชี้มายังตำแหน่งที่เก็บข้อมูลนี้

การจองเนื้อที่หน่วยความจำโดยใช้คำสั่ง new นี้ คอมพิวเตอร์จะจองเนื้อที่นั้นๆไว้ตลอดแม้ว่าเราจะออกจากฟังก์ชันนั้นๆแล้วก็ตาม การคืนเนื้อที่หน่วยความจำนี้เราจะต้องทำการคืนเองโดยใช้คำสั่ง delete รูปแบบของคำสั่งของ delele จะเป็นแบบนี้ครับ

delete pointer;

เช่นในตัวอย่างข้างต้นถ้าผมต้องการคืนหน่วยความจำที่มี pointer p ชี้อยู่ ผมจะสั่งว่า

delete p;

ในโปรแกรมขนาดใหญ่ซึ่งใช้ตัวแปรค่อนข้างมาก เพื่อให้การทำงานของโปรแกรมมีประสิทธิภาพจะใช้การจองหน่วยความจำ และการปล่อยหน่วยความจำเองครับ แต่เนื่องด้วยความซับซ้อนของโปรแกรม ก็มีโอกาสเหมือนกันครับที่โปรแกรมเมอร์จะคืนคืนหน่วยความจำให้กับเครื่องไม่หมด ปัญหานี้เรียกว่า memory leak เมื่อตัวแปรที่เราไม่ได้คืนหน่วยความจำสะสมมากขึ้นๆ เครื่องของเราเครื่องเราทำงานหนักขึ้นๆ เรื่อยๆ จนถึงระดับหนึ่งจะเกิดการ crash ของโปรแกรมครับ

แต่ปัญหา memory leak โดยทั่วๆไปก็ไม่ได้น่ากลัวซะทีเดียวนะครับ เพราะถึงแม้ว่าเราจะคืนหน่วยความจำให้กับเครื่องไม่หมด แต่ถ้าเราออกจากโปรแกรมเมื่อไหร่ระบบปฏิบัติการจะทำการบีบบังคับให้โปรแกรมคืนทรัพยากรทั้งหมดให้กับเครื่องของเราเองครับ

ในภาษา C++ เราสามารถจองเนื้อที่หน่วยความจำแบบเป็น array ด้วยนะครับ เช่น สมมติว่าเราต้องการจองหน่วยความจำเป็นเป็น array ของ int ความยาว 4 เราจะสั่งเป็น

int* p=new int[4];

ส่วนคำสั่งคืนหน่วยความจำที่จองมาเราจะใช้เป็น

delele []p;

อย่าลืม [] หน้า p นะครับ ไม่เช่นนั้นมันจะทำการคืนหน่วยความจำ p[0] แค่ตัวเดียวเท่านั้น!!!

การจองหน่วยความจำและปล่อยหน่วยความจำที่จองมาด้วยตนเองมีชื่อทางเทคนิคว่า dynamic memory allocation คำว่า dynamic ในที่นี้จะเป็นหมายความว่า “มีความยืดหยุ่น” คือจะคืนหน่วยความจำให้เครื่องตอนไหนก็ได้ (คำนี้เป็นคำข้ามกับคำว่า static ครับ)

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: