c++ - 插槽后 Qt 访问冲突 0xC0000005

标签 c++ qt qt4

我有一个问题,我刚刚想好该怎么做,所以也许你可以帮助我。

我正在开发一个连接到数据库、显示值并允许用户更新/插入值的应用程序。

我有一个 QTabView,其中一个选项卡内有四个 QTableWidget。 在这个表中有时(取决于数据库的值)一个 QComboBox 来选择一些预定义的值。 我用 QSignalMapper 捕获 QComboBox::selectedIndexChanged(int) 并有一个 slot 连接到 QSignalMapper 以提供一些信息它是什么表以及更改了什么设置。我有时会创建新的 SettingsMapper(并在此之前将其删除)以重置“过时的”映射器组合框连接。

所以问题是,当我更改组合框内的索引时,插槽被调用,我可以调试到 moc_*.cpp,其中信号/插槽连接的开关所在,但之后我得到 地址 0xC0000005 上的访问冲突 在 dll 中。

这里是调用栈:

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)中运行时,问题似乎也消失了......ò.Ó

有什么建议吗?

最佳答案

From time to time i create the SettingsMapper new (and delete it before that) to reset the 'outdated' mapper-combobox connections.

您是否偶然从信号映射器发送的信号所调用的插槽中删除了信号映射器?这是不允许的,当您当前处于该实例的方法中时无法删除该实例。

解决方案是改用 deleteLater()。当控制返回到事件循环时,这将导致对象被删除。

关于c++ - 插槽后 Qt 访问冲突 0xC0000005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14836999/

相关文章:

c++ - 哪些是从线程通过 PostMessage 发送 CString 的安全方法

C++ std::List 在中间和结尾之间插入?

c++ - 如何在不使用连接功能的情况下连接信号和插槽?

c++ - 如何在 C++ (sfml) 中获取图像中像素的颜色

c++ - 通过 SDL 1.2 的多个窗口?

c++ - Qt:在单独的函数中使用ui指针

c++ - QTextEdit 如何从 C++ 修改样式表元素

qt - 将 QTQuick 与 haskell 一起使用

Qt 和双缓冲 - 是否有任何巧妙的技巧来捕获像素或操作后台缓冲区?

qt - 单击窗口上的任何其他地方时如何从 QLineEdit 中移除焦点