我从类中的两个函数返回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->slot
和this->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函数中的错误,谢谢你的帮助。
答案 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)以减少内存使用并避免 不必要的数据复制。