Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt应用程序在MacOSX上运行良好,在Windows上访问冲突_Windows_Qt_Exception_Qt4_Access Violation - Fatal编程技术网

Qt应用程序在MacOSX上运行良好,在Windows上访问冲突

Qt应用程序在MacOSX上运行良好,在Windows上访问冲突,windows,qt,exception,qt4,access-violation,Windows,Qt,Exception,Qt4,Access Violation,所以我遇到了一个暂时无法解决的问题。我在C++中编写了QT应用程序,并在MaCOSX上开发,运行良好。但是,当我在windows中测试代码时,当我关闭或取消我拥有的QDialog子项时,我遇到了以下访问冲突: MyApp.exe中0x5ce6b1ea(QtGuid4.dll)处未处理的异常:0xc000005:访问冲突读取位置0xfeeefefa。 通过调试,我看到它在多次Qt api调用后崩溃,最终进入QWindowsSurface_Raster.cpp。以下是它崩溃的Qt库代码: #endi

所以我遇到了一个暂时无法解决的问题。我在C++中编写了QT应用程序,并在MaCOSX上开发,运行良好。但是,当我在windows中测试代码时,当我关闭或取消我拥有的QDialog子项时,我遇到了以下访问冲突:

MyApp.exe中0x5ce6b1ea(QtGuid4.dll)处未处理的异常:0xc000005:访问冲突读取位置0xfeeefefa。

通过调试,我看到它在多次Qt api调用后崩溃,最终进入QWindowsSurface_Raster.cpp。以下是它崩溃的Qt库代码:

#endif
{
    QPoint wOffset = qt_qwidget_data(widget)->wrect.topLeft();

    HDC widget_dc = widget->getDC();

    QRect wbr = br.translated(-wOffset);
    BitBlt(widget_dc, wbr.x(), wbr.y(), wbr.width(), wbr.height(),
/*CRASH HERE!*/   d->image->hdc, br.x() + offset.x(), br.y() + offset.y(), SRCCOPY);
        widget->releaseDC(widget_dc);
    }
最后这是我的代码,我称之为qdialog:

void MainWindow::prefDialog()
{
        prefD = new PreferenceDialog(this);
        prefD->exec();
} /* crashes here, after I hit cancel/ok on dialog and it leaves exec */
PreferenceDialog.h:

class PreferenceDialog : public QDialog
{
    Q_OBJECT

public:
    PreferenceDialog(QWidget *parent);
.....
PreferenceDialog.c

PreferenceDialog::PreferenceDialog(QWidget *parent) :
    QDialog(parent)
{
....
connect(okayButton, SIGNAL(released()), this, SLOT(okayClicked()));
connect(addKeyButton, SIGNAL(released()), this, SLOT(addClicked()));
connect(cancelButton, SIGNAL(released()), this, SLOT(cancelClicked()));
    ....
我可以向您展示我的首选项对话框代码,或者任何其他代码,但我认为这只会让事情变得臃肿。PreferenceDialog除了显示的功能外,没有其他功能,我也不会重写任何函数,比如exec(),等等。堆栈跟踪也非常臃肿,所以我现在不会发布,它只是在exec()完成后(大约10次)调用一堆Qtguid4.dll,直到它在QWindowRaster中出现崩溃


如果需要任何其他信息,请告诉我。我是Qt的新手,所以很难弄明白这一点,任何帮助都将不胜感激,谢谢

我调用了QDialog::destroy()来关闭窗口,而不是QDialog::close()。这导致Qt在完成QDialog::exec()时出现空指针异常,并导致Windows崩溃。将调用更改为close()修复了该问题


谢谢霍斯蒂尔福克的建议

你可以试试我的建议。我看到它对过去导致HDC相关内容的问题给出了一些反馈…它对我的具体问题没有帮助,但我肯定可以在其他领域使用它,感谢infoWell,它值得一试…如果你把它留在里面,我打赌它会在不久的将来为你节省一些时间。我把它放在每个项目中。前进…即使它涉及一些文件,你能提出一个最小的情况吗?只需从程序中删除按钮和代码行,直到崩溃消失。然后将其添加回,并重复该过程。你要么会发现问题,要么会有一些很短的东西,我们可以自己编译并复制它!啊,谢谢你的建议。。我不知道为什么我没有想到这一点,而不是试图通过所有的代码。结果是我调用destroy();而不是在取消对话框时关闭(),因此在我销毁它之后,它一定在exec中的某个位置调用了空指针。。。不知道为什么它没有在Mac上这样做,很难找到bug,谢谢!另外,StackOverflow的新功能。。我假设我应该用这些信息回答我自己的问题。。?