【发布时间】:2021-03-15 15:36:03
【问题描述】:
我有这个代码: mainclass.cpp 文件:
#include "mainclass.h"
#include <QtDebug>
#include <QApplication>
Domino *domino = new Domino();
int main(int argc, char *argv[])
{
qDebug()<< __FUNCTION__;
QApplication a(argc, argv);
MainClass w;
w.show();
return a.exec();
}
MainClass::MainClass(QWidget *parent) : QMainWindow(parent)
{
qDebug()<< __FUNCTION__;
//Domino *domino = new Domino();
connect(domino, SIGNAL(OneImageReceivedSignal()), this, SLOT(OneImageReceivedSlot()));
domino->ReceiveAnImage();
}
void MainClass::OneImageReceivedSlot(){
qDebug()<< __FUNCTION__;
}
domino.cpp 文件:
#include "domino.h"
#include <QtDebug>
Domino::Domino(QObject *parent) : QObject(parent)
{
qDebug()<< __FUNCTION__;
cdl_img_acquisition_= new CDLImageAcquisition();
connect(cdl_img_acquisition_, SIGNAL(OneImageReceivedSignal()), this, SIGNAL(OneImageReceivedSignal()));
}
void Domino::ReceiveAnImage(){
qDebug()<<__FUNCTION__;
cdl_img_acquisition_->ReceiveAnImage();
}
CDLImageAcquisition *Domino::get_cdl_img_acquisition(){
qDebug()<< __FUNCTION__;
return this->cdl_img_acquisition_;
}
icdlimageacquisition.cpp 文件:
#include "cdlimageacquisition.h"
#include<QtDebug>
CDLImageAcquisition::CDLImageAcquisition(QObject *parent) : QObject(parent)
{
qDebug()<< __FUNCTION__;
icdlcam_=new ICDLCam();
connect(icdlcam_, SIGNAL(OneImageReceivedSignal()),this, SIGNAL(OneImageReceivedSignal()));
}
void CDLImageAcquisition::ReceiveAnImage(){
qDebug()<<__FUNCTION__;
icdlcam_->ReceiveAnImage();
}
ICDLCam *CDLImageAcquisition::get_cdl_cam(){
qDebug()<< __FUNCTION__;
return this->icdlcam_;
}
icdlcam.cpp 文件:
#include "icdlcam.h"
#include <assert.h>
#include <QtDebug>
ICDLCam::ICDLCam(QObject *parent) : QObject(parent)
{
qDebug()<< __FUNCTION__;
}
void ICDLCam::ReceiveAnImage(){
qDebug()<<__FUNCTION__;
emit OneImageReceivedSignal();
}
当我使用 MSVC 2015 或 2019 构建和运行时,程序崩溃如下:
15:57:25: Starting C:\Users\User\source\DL01-SOFTWARE\build-DOMINO-TEST2-Desktop_Qt_5_15_0_MSVC2019_64bit-Debug\Lib\debug\Lib.exe ...
Domino::Domino
CDLImageAcquisition::CDLImageAcquisition
ICDLCam::ICDLCam
15:57:27: The program has unexpectedly finished.
15:57:27: The process was ended forcefully.
15:57:27: C:\Users\User\source\DL01-SOFTWARE\build-DOMINO-TEST2-Desktop_Qt_5_15_0_MSVC2019_64bit-Debug\Lib\debug\Lib.exe crashed.
调试器在 CDLImageAcquisition 构造函数的connect(icdlcam_, SIGNAL(OneImageReceivedSignal()),this, SIGNAL(OneImageReceivedSignal())); 处崩溃。
它显示此消息对话框:“异常触发:下级停止,因为它触发了异常。在线程 0 中停止:异常在 0x7fff9dd8da2a,代码:0xc0000005:读取访问冲突:0x0,标志 = 0x0(第一次机会) .
程序在以下情况下不会崩溃:
- 我在
MainClassconstructor 的局部范围内声明并初始化domino变量 - 无论
dominovariable 的范围如何,我都使用 MinGW 编译器构建和运行。
我必须在不支持 MinGW 编译器的 Windows 中使用 Pylon API,并且稍后我还需要domino 变量的全局范围。我也试过把它作为一个类的静态成员,但结果是一样的。
【问题讨论】:
-
谢谢,我刚刚编辑了 main() 函数。因为我在发问题之前试图清理代码,所以被删除了,错误是一样的。
-
我试过 std::unique_ptr
domino(new Domino());然后连接(domino.get(),信号(OneImageReceivedSignal()),这个,SLOT(OneImageReceivedSlot()));它给出了同样的错误。 -
将 Domino 变量设为静态是否有帮助?
static Domino *domino = new Domino();. -
@E4z9 正如我在帖子中提到的,我尝试了
static,但结果与全局相同,因为我必须在函数的本地范围之外对其进行初始化。
标签: c++ qt visual-c++ global-variables