2013-02-12 2 views
1

나는 무엇을 해야할지 알았 기 때문에 아마도 나를 도울 수 있습니다.슬롯 이후 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)에서 실행 중일 때 문제가 사라진 것 같습니다 ... ò.Ó

어떤 조언이 필요합니까?

답변

2

때때로 나는 새로운 (그리고 그 전에 삭제) '오래된'매퍼 - 콤보 연결을 재설정 SettingsMapper을 만들 수 있습니다.

신호 매퍼에서 보낸 신호로 불리는 슬롯에서 신호 매퍼를 삭제 하시겠습니까? 그것은 허용되지 않습니다. 현재 인스턴스의 메소드에있을 때 인스턴스를 삭제할 수 없습니다.

해결 방법은 deleteLater()를 대신 사용하는 것입니다. 그러면 컨트롤이 이벤트 루프로 돌아갈 때 개체가 삭제됩니다.

+0

와우 당신은 내게 두 번 생각할 수있게 만들었습니다 ... 나는 무엇이 계속 진행되고 있는지 확인하겠습니다. 편집 :'QObject :: deleteLater()'도'QSharedPointer ''연산자 = '도 사용할 때? – Zaiborg

+0

고마워, 공유 포인터에서 작동하지 않는 것처럼 보이지만 간단하게'QSignalMapper * '로 바꿨다. 제대로 작동한다. : D – Zaiborg

+1

@Zaiborg 스마트 포인터를 사용하면 정확한 스마트 포인터 클래스의 규칙을 이해하는 것이 중요합니다. 일반적으로 부모가있는 QObject를 사용하면 스마트 포인터가 실제로 필요한 경우 'QPointer'또는 'QWeakPointer'를 사용해야하며 다른 곳에서 삭제 된 QObject를 처리 할 수 ​​있습니다. 그리고 부모가없는 QObject를 가질 때, 항상 부모님을 가지지 않는 것이 정말 좋습니다. 왜냐하면 부모님이 제대로 삭제되었는지 확인하는 것이 정말 편리하기 때문입니다. – hyde

관련 문제