Qt/C++ ออกด้วยรหัส -1073741819 (โปรแกรมขัดข้องด้วยรหัสข้อยกเว้น c0000005)

ฉันมีปัญหากับโปรแกรมของฉันขัดข้อง ฉันได้รับป๊อปอัปหน้าต่าง "Program.exe หยุดทำงาน" ซึ่งระบุรหัสข้อยกเว้นของฉันคือ c0000005 เมื่อฉันกลับไปที่เอาต์พุตจากแอปพลิเคชันใน Qt มันจะแสดง:

C:\Users\Me\Desktop\project\project-build-desktop\debug\project.exe exited with code -1073741819

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

บรรทัดคือ:

db=newDb;

สิ่งนี้อยู่ในตัวสร้างของคลาส wndChildWhatever ของฉันซึ่งเป็น QMainWindow newDb ถูกกำหนดไว้ในอาร์กิวเมนต์ตัวสร้างเป็น DatabaseManager *newDb และ db เป็นสมาชิกส่วนตัวของ wndChild ที่กำหนดเป็น DatabaseManager *db ที่อยู่ฐานข้อมูลนี้ถูกส่งไปทั่วโปรแกรมของฉัน และ wndChildWhatever นี้เป็นเพียงที่อยู่เดียวที่ฉันประสบปัญหา

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

ฉันไม่แน่ใจจริงๆ ว่าเกิดอะไรขึ้นที่นี่ และหวังว่าจะมีคนช่วยได้


person Joseph    schedule 10.11.2010    source แหล่งที่มา
comment
คุณลืมพนักงานรับผ้าเช็ดตัวที่สาย 42   -  person Edward Strange    schedule 10.11.2010
comment
รันโปรแกรมของคุณในดีบักเกอร์ มันจะหยุดทันทีเมื่อ AV เกิดขึ้น โดยไม่ต้องคาดเดา นอกจากนี้ยังจะให้ call stack แก่คุณและอาจมี vars ในเครื่องด้วย   -  person MSalters    schedule 10.11.2010


คำตอบ (4)


เส้นที่ผิด:

db=newDb;

และคุณพูดว่า:

and db is a private member of wndChild

ดูเหมือนว่าตัวชี้ this ของคุณอาจไม่ถูกต้อง นั่นคือ หากสิ่งนี้เกิดขึ้นในวิธี foo คุณกำลังทำบางอย่างเช่น wndChild->foo() และ wndChild เป็นตัวชี้ที่ไม่ถูกต้อง ดังนั้น เมื่อเข้าถึงออฟเซ็ตของ db ที่สัมพันธ์กับ wndChild คุณพบการละเมิดการเข้าถึง (รหัสข้อผิดพลาด NT 0xc0000005, Windows พูดสำหรับการอ้างอิงตัวชี้ที่ไม่ดี)

person asveikau    schedule 10.11.2010
comment
ฉันก็คิดอย่างนั้นเหมือนกัน ยกเว้นว่าเขาบอกว่าคำสั่งของเขาเกิดขึ้นในตัวสร้าง wndChild ไม่ใช่เรื่องง่ายที่จะมีตัวชี้นี้ที่ไม่ถูกต้องจากภายในตัวสร้าง ฉันคิดว่า.... - person Jeremy Friesner; 10.11.2010
comment
@Jeremy Friesner - บางทีชั้นเรียนของเขาอาจถูกจัดสรรบนสแต็กและมีล้น - person asveikau; 10.11.2010
comment
หรือบางทีในบรรทัดอื่นเขาสามารถส่ง this ไปยังโค้ดอื่น ๆ ที่ทำ delete... - person asveikau; 10.11.2010

เป็นไปได้มากว่าไม่ใช่บรรทัด db=newDb ที่ทำให้เกิดข้อขัดข้อง แต่เป็นโค้ดอื่น ๆ ที่ถูกเรียกใช้งานในภายหลัง ซึ่งจะไม่ถูกดำเนินการหากคุณไม่ได้ตั้งค่า db ดูโค้ดอื่นภายในคลาส wndChildWhatever ของคุณ และดูว่าโค้ดนี้ทำอะไรกับค่า (db) บางทีมันอาจจะกำลังทำอะไรซุกซน เช่น ลบมันในขณะที่โค้ดอื่นยังใช้งานอยู่?

person Jeremy Friesner    schedule 10.11.2010
comment
สิ่งนี้คือ db ยังไม่ได้ถูกใช้ที่ไหนใน wndChildWhatever ฉันไม่สามารถใช้งานได้หากไม่ได้กำหนดอย่างถูกต้อง และการมอบหมายจะทำให้โปรแกรมของฉันขัดข้อง ตอนนี้ wndChildWhatever เป็นเรื่องง่ายมาก ฉันจะเล่นต่อไป ดูว่าฉันสามารถหาแหล่งที่มาของปัญหาได้ดีขึ้นหรือไม่ ขอบคุณสำหรับข้อมูลของคุณ! - person Joseph; 10.11.2010
comment
อืม. เมื่อสิ่งอื่นๆ ล้มเหลว ให้ลองทำความสะอาด ทำ. บางครั้งอ็อบเจ็กต์ไฟล์ไม่ได้รับการคอมไพล์ใหม่ตามที่ควรจะเป็น และมีสิ่งแปลก ๆ เกิดขึ้น (tm) - person Jeremy Friesner; 10.11.2010
comment
ฉันเชื่อว่านี่คือสิ่งที่เกิดขึ้น ฉันกำลังเล่นกับโค้ดของฉันและเพิ่ม QMessageBox ไปยัง deconstructor wndChild ของฉันเพื่อดูว่าโปรแกรมขัดข้องใน deconstructor ของหน้าต่างนั้นหรือไม่ หรือจะเกิดอะไรขึ้นในฟังก์ชันอื่น ๆ หลังจากการดีคอนสตรัคชั่น เมื่อฉันทำเช่นนั้น โปรแกรมก็หยุดทำงานล้มเหลว เมื่อฉันแสดงความคิดเห็นเกี่ยวกับ QMessageBox และยังคงได้รับมันอยู่! ฉันสร้างใหม่ทั้งหมดใน Qt และไม่มีปัญหาตั้งแต่นั้นมา - person Joseph; 11.11.2010

ด้วยบรรทัด db=newDb คุณจะมีสองตัวชี้ไปยังวัตถุเดียวกัน คุณทำอะไรในการทำลายล้าง? หากคุณมี "delete db" และ "delete newDb" คุณจะลบวัตถุเดียวกันสองครั้งซึ่งอาจนำไปสู่ความผิดพลาดหรือไม่

person hmuelner    schedule 10.11.2010

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

person Reynaldo Silva E Silva    schedule 12.10.2013