Qt信号槽和内存分配

时间:2018-03-29 14:51:36

标签: c++ qt

我有一个与外部应用程序通信的应用程序,它可以控制设备。当新数据到达此设备时,我的应用程序应向此设备发送“答案”。与外部应用程序的通信是通过一些回调函数完成的,我使用信号/插槽将正确的消息传递给回调。 我的问题是,在原始信号返回后,应用程序崩溃并出现SIGSEGV错误。据我所知,这个错误指的是内存中的故障。由于外部应用程序可以处理/破坏/破坏原始数据,您能告诉我这是否是一种使用信号/插槽机制的安全方法?或者这可能导致了SIGSEGV?贝娄,我发布了一个代码片段作为示例:

MyClass::MyClass()
{ 
    notifierData = new QWinEventNotifier(HandleData);
    objectItem = new ObjectItem();
    connect(notifierData,SIGNAL(activated(HANDLE)),SLOT(newDataSlot(HANDLE)));
    QObject::connect(this, SIGNAL(objectData(int, QByteArray)), objectItem, SLOT(dataChangedSlot(int, QByteArray)), Qt::QueuedConnection) ;
}
void MyClass::newDataSlot(HANDLE)
{
    DataType data;
    GetDataFromExternalCallback(&data);
    QByteArray bytearrayData(data.str);

    emit objectData(data.TC_Index, bytearrayData);
 }

void ObjectItem::dataChangedSlot(int index, QByteArray data)
{
    emit dataChanged(index, data);
}

DeviceInterface::DeviceInterface()
{
    Init(Line1);
}
void SetObjectItem(ObjectItem *anObjectItem)
{
    objectItem = anObjectItem;
    if(objectItem != NULL)
    connect(objectItem, SIGNAL(dataChanged(int, QByteArray)), this, SLOT(newDataRecevied(int, QByteArray)), Qt::QueuedConnection);
}

void DeviceInterface::newDataRecevied(int index, QByteArray data)
{
    QString messageToDisplay = "Reply Answer";

    if(objectItem != NULL)
    {
        objectItem->updateDeviceDisplay(index, messageToDisplay);
    }
}

bool DeviceInterface::updateDeviceDisplay(int index, QString text)
{
    //Line1 is class member: char Line1[20]
    sprintf_s(Line1, 20, "%s", UnicodeToCodePage(1253,text.toStdWString().c_str()));
    SendDataWithExternalCallback(&Line1);
    return true;
}

0 个答案:

没有答案