ในขณะที่การจัดสรรหน่วยความจำแบบไดนามิก หน่วยความจำจะถูกจัดสรรในขณะที่การดำเนินการเริ่มต้นขึ้น หน่วยความจำนี้จัดสรรด้วยตนเองโดยโปรแกรมเมอร์ในขณะรันไทม์ หรือที่เรียกว่าการจัดสรรหน่วยความจำรันไทม์ใน 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++