ใช่มีปัญหาเกี่ยวกับพอยน์เตอร์ เป็นไปได้มากว่าคุณกำลังใช้งานที่ไม่ได้เริ่มต้นอย่างถูกต้อง แต่ก็เป็นไปได้ว่าคุณกำลังทำให้การจัดการหน่วยความจำของคุณยุ่งเหยิงด้วยการเพิ่มอิสระสองครั้งหรือบางอย่าง
เพื่อหลีกเลี่ยงไม่ให้พอยน์เตอร์ที่ไม่ได้กำหนดค่าเริ่มต้นเป็นตัวแปรท้องถิ่นให้ลองประกาศให้ช้าที่สุดเท่าที่จะทำได้โดยเฉพาะอย่างยิ่ง (ซึ่งเป็นไปไม่ได้เสมอไป) เมื่อสามารถเริ่มต้นด้วยค่าที่มีความหมายได้ โน้มน้าวตัวเองว่าพวกเขาจะมีค่าก่อนที่จะถูกใช้โดยการตรวจสอบโค้ด หากคุณมีปัญหาให้เริ่มต้นให้เป็นค่าคงที่ของตัวชี้ที่เป็นโมฆะ (โดยปกติจะเขียนเป็นNULL
หรือ0
) แล้วตรวจสอบ
เพื่อหลีกเลี่ยงตัวชี้ที่ไม่ได้กำหนดค่าเริ่มต้นเป็นค่าสมาชิกตรวจสอบให้แน่ใจว่าได้เริ่มต้นอย่างถูกต้องในตัวสร้างและจัดการอย่างถูกต้องในตัวสร้างสำเนาและตัวดำเนินการกำหนด อย่าพึ่งพาinit
ฟังก์ชันสำหรับการจัดการหน่วยความจำแม้ว่าคุณจะสามารถเริ่มต้นอื่น ๆ ได้
ถ้าชั้นเรียนของคุณไม่ต้องการตัวสร้างการคัดลอกหรือตัวดำเนินการมอบหมายคุณสามารถประกาศให้เป็นฟังก์ชันสมาชิกส่วนตัวและไม่ต้องกำหนด ซึ่งจะทำให้เกิดข้อผิดพลาดของคอมไพเลอร์หากมีการใช้งานอย่างชัดเจนหรือโดยปริยาย
ใช้ตัวชี้อัจฉริยะเมื่อมี ข้อได้เปรียบที่สำคัญคือหากคุณยึดติดและใช้มันอย่างสม่ำเสมอคุณสามารถหลีกเลี่ยงการเขียนได้อย่างสมบูรณ์delete
และจะไม่มีการลบซ้ำ
ใช้สตริง C ++ และคลาสคอนเทนเนอร์ทุกครั้งที่ทำได้แทนสตริงและอาร์เรย์สไตล์ C พิจารณาใช้.at(i)
มากกว่า[i]
เพราะจะบังคับให้มีการตรวจสอบขอบเขต ดูว่าคอมไพลเลอร์หรือไลบรารีของคุณสามารถตั้งค่าให้ตรวจสอบขอบเขตได้[i]
หรือไม่อย่างน้อยก็ในโหมดดีบัก ความผิดพลาดในการแบ่งกลุ่มอาจเกิดจากการโอเวอร์รันบัฟเฟอร์ที่เขียนขยะทับตัวชี้ที่ดีอย่างสมบูรณ์แบบ
การทำสิ่งเหล่านั้นจะช่วยลดโอกาสในการเกิดข้อผิดพลาดในการแบ่งส่วนและปัญหาหน่วยความจำอื่น ๆ ได้มาก พวกเขาจะล้มเหลวในการแก้ไขทุกอย่างอย่างไม่ต้องสงสัยและนั่นคือเหตุผลที่คุณควรใช้ valgrind ในตอนนี้เมื่อคุณไม่มีปัญหาและ valgrind และ gdb เมื่อคุณทำ
g
ในบริบทหมายความว่าCMake
อย่างไร