2

const char*从一个类的两个函数返回 a 时遇到问题,由于某种原因,第一个值是第二个值的副本,或者某些值是错误的,但是返回的两个值都来自不同的指针,在这种情况下是两个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;
}

Thethis->slot和 thethis->signals分别QMap<QString, QString>保存插槽和信号签名(somesignal(int)或分别someslot(bool)使用键somesignalsomeslot

我使用的类是通过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

我填充QMaps 是一些函数:

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

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

4

3 回答 3

6

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

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

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

您应该改为直接返回 QByteArray,而不是char*. 这仍然有效,因为 QByteArray 使用隐式共享

于 2012-11-20T18:57:48.613 回答
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
}
于 2012-11-20T19:01:12.493 回答
0

QByteArray应该优先于char*. 来自 Qt 文档

QByteArray 类提供了一个字节数组。

QByteArray 可用于存储原始字节(包括“\0”)和传统的 8 位“\0”结尾的字符串。使用 QByteArray 比使用 const char * 方便得多。在幕后,它始终确保数据后跟一个 '\0' 终止符,并使用隐式共享(写时复制)来减少内存使用并避免不必要的数据复制。

于 2013-11-09T08:21:32.443 回答