ให้เราดูตัวอย่างที่คุณอาจสามารถเข้าถึงหน่วยความจำของตัวแปรในเครื่องนอกขอบเขตได้
ตัวอย่าง
#include<iostream> int* foo() { int x = 3; return &x; } int main() { int* address = foo(); cout << *address; *address = 12; cout << *address; }
ผลลัพธ์
สิ่งนี้อาจให้ผลลัพธ์ -
3 12
อย่างที่ฉันได้กล่าวไปแล้ว รหัสนี้อาจใช้ได้ เราแค่อ่านและเขียนในหน่วยความจำที่ใช้เป็นที่อยู่ของ x โดยหลักแล้ว คุณอยู่นอกขอบเขตของ foo ที่อยู่จะเป็นตัวชี้ไปยังพื้นที่หน่วยความจำแบบสุ่ม ในตัวอย่างข้างต้น พื้นที่หน่วยความจำนั้นมีอยู่จริงและไม่มีอะไรอื่นกำลังใช้งานอยู่ในขณะนี้ คุณจะไม่ทำลายสิ่งใด ๆ ด้วยการใช้งานต่อไป (คุณจะไม่ใช้พื้นที่หน่วยความจำของกระบวนการอื่นหรือพื้นที่หน่วยความจำที่ไม่ได้รับอนุญาตอื่น ๆ ) และยังไม่มีสิ่งใดเขียนทับมัน ดังนั้น 3 ตัวจึงยังคงอยู่
ในโปรแกรมจริง หน่วยความจำนั้นอาจถูกนำกลับมาใช้ใหม่เกือบจะในทันที และคุณอาจทำบางอย่างเสียหายได้ เช่น การทำเช่นนี้ ข้อบกพร่องในการเข้าถึงหน่วยความจำดังกล่าวนั้นยากต่อการติดตามและกำจัด
เมื่อคุณกลับมาจาก foo โปรแกรมจะบอก OS ว่าหน่วยความจำของ x ไม่ได้ถูกใช้อีกต่อไป และสามารถกำหนดใหม่ให้กับอย่างอื่นได้ หากคุณโชคดีและได้รับการมอบหมายใหม่ และระบบปฏิบัติการไม่ตรวจจับว่าคุณใช้มันอีก คุณก็สามารถใช้งานได้