const char * Qt中的错误行为

时间:2012-11-20 18:54:15

标签: c++ qt pointers qstring qmap

我从类中的两个函数返回const char*时出现问题,由于某种原因,第一个值是第二个值的副本或某些值是错误的,但返回的两个值来自不同的指针,在这种情况下有两个QMap,以下是两个函数的代码:

const char* SomeClass::getSignal(QString signalName)
{
    QString signalsignature = this->signals.value(signalName);
    signalsignature.prepend(QString::number(QSIGNAL_CODE));
    QByteArray ba = signalsignature.toLatin1(); // i try toUTF8 and to Local8Bit
    const char* signalformated = ba.constData();
    return signalformated;
}

const char* SomeClass::getSlot(QString slotName)
{
    QString slotsignature = this->slots.value(slotName);
    slotsignature.prepend(QString::number(QSLOT_CODE));
    QByteArray ba = slotsignature.toLatin1();
    const char* slotformated = ba.constData();
    return slotformated;
}

this->slotthis->signals QMap<QString, QString>是保存广告位和信号签名(somesignal(int)someslot(bool),密钥为somesignal,{someslot 1}}分别)。

我使用的类是通过QLibrary使用接口从DLL加载的,所有使用其他函数都可以正常工作,但是使用这样的函数:

const char* signal = someclassinstance->getSignal(tr("clicked"));
const char* slot = someclassinstance->getSlot(tr("onclicked"));

cout << "connecting signal " << signal << " to slot " << slot << endl;
这告诉我:

connecting signal clicked to slot rc

和我使用QObject :: connect

时的错误
Object::connect: Use the SLOT or SIGNAL macro to connect NovaRadioButton:: rc

我用QMap填充了一些函数:

signals.insert(methodname,QString(metamethod.signature()));

我不知道我做错了什么,或者QString可能是Qt函数中的错误,谢谢你的帮助。

3 个答案:

答案 0 :(得分:6)

当您的函数退出时,ba对象将被销毁。返回的指针指向不再存在的对象的内存位置。这是返回指向本地的指针的基本(也是众所周知的)错误:

char* foo()
{
    char c = 'a';
    return &c;
}

你正在处理QByteArray的事实并不重要;它仍然是一个自动的局部变量,因此在函数退出时会被破坏。

您应该直接返回QByteArray,而不是char*。这仍然有效,因为QByteArray使用implicit sharing

答案 1 :(得分:2)

没有错误,你正在返回一个指向已被破坏的对象内部的指针。

重写你的功能

QByteArray SomeClass::getSignal(QString signalName)
{
    QString signalsignature = this->signals.value(signalName);
    signalsignature.prepend(QString::number(QSIGNAL_CODE));
    return signalsignature.toLatin1(); // i try toUTF8 and to Local8Bit
}

答案 2 :(得分:0)

QByteArray应优先于char*。来自Qt docs

  

QByteArray类提供一个字节数组。

     

QByteArray可用于存储两个原始字节(包括'\ 0')和   传统的8位'\ 0'终止字符串。使用QByteArray很多   比使用const char *更方便。在幕后,它始终如一   确保数据后跟'\ 0'终止符,并使用   隐式共享(copy-on-write)以减少内存使用并避免   不必要的数据复制。