나는 무엇을 해야할지 알았 기 때문에 아마도 나를 도울 수 있습니다.슬롯 이후 Qt 액세스 위반 0xC0000005
데이터베이스에 연결하여 값을 표시하고 사용자가 값을 업데이트/삽입 할 수있게하는 응용 프로그램을 작성 중입니다.
나는 QTabView
이고 탭 중 하나에는 QTableWidget
이 4 개 있습니다. 이 표 내부에는 때로는 (데이터베이스 값에 따라 다름) QComboBox
을 사용하여 미리 정의 된 값을 선택할 수 있습니다. 으로 QComboBox::selectedIndexChanged(int)
을 붙잡고 을 QSignalMapper
에 연결하면 어떤 테이블인지, 어떤 설정이 변경되었는지 알 수 있습니다. 때로는 '오래된'매퍼 - 콤보 박스 연결을 재설정하기 위해 새로운 SettingsMapper를 생성하고 (이전에 삭제) 설정합니다.
그래서 문제는, 내가 콤보 박스 안의 색인을 바꿀 때 슬롯이 호출되고 신호/슬롯 연결의 스위치가있는 moc _ *. cpp로 디버깅 할 수 있지만 그 후에는 dll에 access violation on address 0xC0000005
이 있습니다. 여기
호출 스택 : 다른 탭에서
QtCored4.dll!6721af70()
[Frames below may be incorrect and/or missing, no symbols loaded for QtCored4.dll]
QtCored4.dll!67219fe5()
QtCored4.dll!67218f14()
QtCored4.dll!67218e48()
QtCored4.dll!6721903d()
QtCored4.dll!6720f874()
QtCored4.dll!6702429b()
QtCored4.dll!670316f3()
QtGuid4.dll!655b93f1()
QtGuid4.dll!650f99d0()
user32.dll!7e41885a()
user32.dll!7e41882a()
user32.dll!7e42b326()
msctf.dll!7472467f()
user32.dll!7e43e1ad()
user32.dll!7e43e18a()
QtCored4.dll!67234b9c()
user32.dll!7e42b372()
user32.dll!7e418734()
user32.dll!7e418816()
user32.dll!7e4189cd()
user32.dll!7e418a10()
QtCored4.dll!672359b6()
ntdll.dll!7c90cfdc()
ntdll.dll!7c958e0d()
ntdll.dll!7c95932a()
ntdll.dll!7c90cfdc()
ntdll.dll!7c9594ca()
ntdll.dll!7c919ca7()
ntdll.dll!7c918f01()
ntdll.dll!7c91925d()
ntdll.dll!7c918f01()
ntdll.dll!7c9101bb()
ntdll.dll!7c9192ef()
ntdll.dll!7c918f01()
ntdll.dll!7c9101bb()
user32.dll!7e4277b0()
user32.dll!7e4277f7()
ntdll.dll!7c90da0c()
kernel32.dll!7c8024c7()
msctf.dll!74725951()
msctf.dll!74725956()
user32.dll!7e418a80()
user32.dll!7e418734()
user32.dll!7e418816()
ntdll.dll!7c96c6a7()
QtCored4.dll!6723c8f6()
datProgram.exe!__tmainCRTStartup() Line 578 + 0x35 bytes C
datProgram.exe.exe!WinMainCRTStartup() Line 403 C
kernel32.dll!7c817067()
`
나 한테 무슨 골동품을 만드는 것은, 즉 전술 한 바와 같이 동일한 방법으로 하나 QTableWidget
이지만, 문제가 발생하지 않습니다. 릴리스 버전 (Ctrl + F5)에서 실행 중일 때 문제가 사라진 것 같습니다 ... ò.Ó
어떤 조언이 필요합니까?
와우 당신은 내게 두 번 생각할 수있게 만들었습니다 ... 나는 무엇이 계속 진행되고 있는지 확인하겠습니다. 편집 :'QObject :: deleteLater()'도'QSharedPointer ''연산자 = '도 사용할 때? –
Zaiborg
고마워, 공유 포인터에서 작동하지 않는 것처럼 보이지만 간단하게'QSignalMapper * '로 바꿨다. 제대로 작동한다. : D – Zaiborg
@Zaiborg 스마트 포인터를 사용하면 정확한 스마트 포인터 클래스의 규칙을 이해하는 것이 중요합니다. 일반적으로 부모가있는 QObject를 사용하면 스마트 포인터가 실제로 필요한 경우 'QPointer'또는 'QWeakPointer'를 사용해야하며 다른 곳에서 삭제 된 QObject를 처리 할 수 있습니다. 그리고 부모가없는 QObject를 가질 때, 항상 부모님을 가지지 않는 것이 정말 좋습니다. 왜냐하면 부모님이 제대로 삭제되었는지 확인하는 것이 정말 편리하기 때문입니다. – hyde