การจัดสรรหน่วยความจำแบบไดนามิกใน C++

Kar Cadsrr Hnwy Khwam Ca Baeb Dinamik Ni C



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

ในขณะที่การจัดสรรหน่วยความจำแบบไดนามิก หน่วยความจำจะถูกจัดสรรในขณะที่การดำเนินการเริ่มต้นขึ้น หน่วยความจำนี้จัดสรรด้วยตนเองโดยโปรแกรมเมอร์ในขณะรันไทม์ หรือที่เรียกว่าการจัดสรรหน่วยความจำรันไทม์ใน C++ ขนาดของหน่วยความจำไดนามิกสามารถเปลี่ยนแปลงได้ทุกตำแหน่งในโปรแกรม เพราะในขณะที่ประกาศ เราไม่ได้ระบุขนาดที่สามารถแก้ไขได้ เราให้ค่าโดยตรงกับตัวแปรเท่านั้น

ความแตกต่างของการจัดสรรหน่วยความจำให้กับตัวแปรปกติ

ในตัวแปรปกติ หน่วยความจำที่จัดสรรโดยคอมไพเลอร์จะถูกจัดสรรและจัดสรรคืนโดยอัตโนมัติ เมื่อหน่วยความจำถูกจัดสรรแบบไดนามิกโดยโปรแกรมเมอร์ เขาจะต้องลบหรือจัดสรรหน่วยความจำเมื่อไม่มีประโยชน์ในการดำเนินการเพิ่มเติมของซอร์สโค้ด สถานการณ์นี้ทำให้เกิด 'การรั่วไหลของหน่วยความจำ' เมื่อโปรแกรมถูกยกเลิกในขณะที่หน่วยความจำไม่ถูกจัดสรรคืน







ตัวดำเนินการสำหรับการจัดสรรแบบไดนามิก

ใน C++ ตัวดำเนินการสองตัวช่วยในการจัดสรรหน่วยความจำและการจัดสรรคืน: 'ใหม่' และ 'ลบ' ที่ใช้สำหรับการจัดสรรและการจัดสรรคืนหน่วยความจำด้วยวิธีที่ดีกว่า



โอเปอเรเตอร์ใหม่

มันหมายถึงความต้องการในการจัดสรรหน่วยความจำ ตัวดำเนินการใหม่จะเริ่มต้นหน่วยความจำและส่งกลับที่อยู่ของหน่วยความจำที่จัดสรรไปยังตัวแปรตัวชี้หากมีหน่วยความจำเพียงพอ



วัตถุตัวชี้ = ใหม่ ข้อมูล - พิมพ์ ;

ลบตัวดำเนินการ

เช่นเดียวกับตัวดำเนินการใหม่ ตัวดำเนินการลบจะถูกใช้เพื่อลบหน่วยความจำที่จัดสรร ใน C++ โปรแกรมเมอร์สามารถใช้ตัวดำเนินการนี้สำหรับการจัดสรรคืน





# ลบ pointer_variable;

ตัวอย่างที่ 1

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

# Int * pointInt;
# ลอย * pointfloat;

เมื่อใช้เครื่องพิมพ์ทั้งสองนี้ เราจะจัดสรรหน่วยความจำแบบไดนามิก



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

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

# Pointint = int ใหม่;

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

# *pointInt = 50;

มีการประกาศค่าทศนิยมสำหรับการลอยตัวของจุดด้วย แสดงค่าหลังจากกำหนด

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

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

ลบจุด ลอย ;

เมื่อคุณบันทึกโค้ดในโปรแกรมแก้ไขข้อความแล้ว เทอร์มินัล Ubuntu จะอนุญาตให้คุณเรียกใช้ซอร์สโค้ดภายในไฟล์ผ่านคอมไพเลอร์ g++

$ g++ -o mem mem.c
$ ./เมม

เมื่อดำเนินการ คุณจะเห็นค่าที่กำหนดให้กับหน่วยความจำ

ตัวอย่างที่ 2

ตัวอย่างนี้มีส่วนร่วมของการโต้ตอบกับผู้ใช้ เราจะใช้ตัวแปรตัวเลขที่จะมีค่าจากผู้ใช้ โปรแกรมนี้จะเก็บผลการเรียนไว้ใน GPA ของนักเรียน ผลลัพธ์ทั้งหมดจะถูกบันทึกในเวลาทำงาน

เมื่อผู้ใช้ป้อนจำนวนนักเรียน หน่วยความจำจะถูกจัดสรรให้กับแต่ละหมายเลข ตัวชี้ชนิดทศนิยมจะเริ่มต้นที่นี่ซึ่งจะใช้ในการจัดสรรหน่วยความจำของผลลัพธ์

เราใช้ตัวชี้เป็นทศนิยมเนื่องจากเกรดเฉลี่ยอยู่ในสัญลักษณ์ทศนิยม เราใช้อาร์เรย์ประเภทตัวชี้สำหรับเกรดเฉลี่ยเนื่องจากอาจส่งผลให้นักเรียนจำนวนมาก

พีทีอาร์ = ใหม่ ลอย [ ในหนึ่ง ]

อาร์เรย์ตัวชี้ที่มีคีย์เวิร์ด 'ใหม่' จะผูกการดำเนินการกับหน่วยความจำ เกรดเฉลี่ยจะถูกป้อนสำหรับนักเรียนแต่ละคน เนื่องจากเราไม่คุ้นเคยกับจำนวนนักเรียนที่ผู้ใช้ต้องการเพิ่ม เราจึงใช้ for วนซ้ำเพื่อป้อน GPA ตามจำนวนที่ป้อน ในการวนซ้ำแต่ละครั้ง ผู้ใช้จะถูกขอให้ป้อนผลลัพธ์ที่ระบุตัวนักเรียน เมื่อบันทึกผลลัพธ์แล้ว เราจะใช้การวนซ้ำอีกครั้งเพื่อแสดงเกรดเฉลี่ยทั้งหมดของนักเรียน ในท้ายที่สุด อาร์เรย์ประเภทพอยน์เตอร์จะถูกลบ เนื่องจากวัตถุประสงค์ของการจัดเก็บไดนามิกสำเร็จแล้ว

ลบ [ ] พีทีอาร์ ;

ตอนนี้เราจะรันโค้ดที่กล่าวถึงข้างต้น ผู้ใช้จะต้องป้อนจำนวนนักเรียนก่อน จากนั้นจะมีการป้อนเกรดเฉลี่ยของนักเรียนแต่ละคน

ตัวอย่างที่ 3

ตัวอย่างนี้ใช้ตัวดำเนินการใหม่และลบสำหรับวัตถุของชั้นเรียน คลาสนี้มีตัวแปรส่วนตัวประเภทจำนวนเต็มที่เก็บอายุ ในส่วนสาธารณะของคลาส ตัวสร้างจะถูกสร้างขึ้นซึ่งจะเริ่มต้นอายุเป็นเลข '10' ใช้ฟังก์ชันอื่นที่นี่ซึ่งจะแสดงอายุที่เริ่มต้นในตัวสร้าง

ตอนนี้เราจะไปที่โปรแกรมหลักสำหรับการจัดสรรแบบไดนามิก วัตถุของคลาสถูกสร้างขึ้นแบบไดนามิก

นักเรียน * พีทีอาร์ = ใหม่ นักเรียน ( ) ;

เมื่อวัตถุถูกสร้างขึ้น ตัวสร้างจะดำเนินการโดยอัตโนมัติ จะมีการเรียกใช้ฟังก์ชันเพื่อรับอายุ สิ่งนี้จะทำผ่าน ptr

พีทีอาร์ - > รับอายุ ( ) ;

และในตอนท้ายหน่วยความจำจะถูกปล่อยออกมา

บทสรุป

การจัดสรรหน่วยความจำแบบไดนามิกถูกจัดสรรในขณะดำเนินการรันไทม์โดยโปรแกรมเมอร์ แทนที่จะเป็นหน่วยเก็บข้อมูลถาวรที่ระบุโดยคอมไพเลอร์ การจัดสรรนี้อยู่บนพื้นฐานแบบสุ่มและสามารถตัดออกได้หลังจากใช้งาน ในขณะที่ในกรณีส่วนใหญ่ ก่อนการลบ กระบวนการดำเนินการจะหยุดลง และการจัดสรรแบบไดนามิกนี้จะทำให้หน่วยความจำรั่วไหล เราได้นำปรากฏการณ์นี้ไปใช้ในแนวทางต่างๆ ในระบบ Ubuntu Linux โดยใช้ภาษาโปรแกรม C++