2

クラスから2つの関数からを返すことに問題がありますconst char*。何らかの理由で、最初の値が2番目の値のレプリカであるか、一部の値が間違っていますが、返される値は両方とも異なるポインターからのものです。この場合は2つQMapです。 2つの関数のコード:

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)somesignalsomeslot

私が使用するクラスは、インターフェイスを使用してDLLからロードされ、QLibrary他の関数を使用してすべて正常に機能しますが、次のような関数を使用します。

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私はsをいくつかの関数で埋めます:

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を使用すると、constchar*を使用するよりもはるかに便利です。舞台裏では、データの後に「\ 0」ターミネータが続くことを常に保証し、暗黙の共有(コピーオンライト)を使用してメモリ使用量を削減し、データの不必要なコピーを回避します。

于 2013-11-09T08:21:32.443 に答える