const char * неправильное поведение в Qt

У меня проблема с возвратом 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 соответственно).

Класс, который я использую, загружается из 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

Я заполняю QMaps это некоторая функция с:

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

Я не знаю, что я делаю неправильно или, может быть, это ошибка в функциях Qt из QString, Спасибо за вашу помощь.

2

Решение

Когда ваши функции выходят, ba объекты уничтожены. Указатели, которые вы возвращаете, указывают внутри ячеек памяти уже не существующих объектов. Это основная (и общеизвестная) ошибка возврата указателей местным жителям:

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

Тот факт, что вы имеете дело с QByteArray, не имеет значения; это все еще автоматическая локальная переменная, которая уничтожается при выходе из функции.

Вместо этого вы должны возвращать QByteArray напрямую, а не char*, Это все еще эффективно, так как QByteArray использует неявное разделение.

6

Другие решения

Нет ошибок, вы возвращаете указатель на внутренности объекта, который был уничтожен.

Перепиши свои функции вот так

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

QByteArray должно быть предпочтительнее char*, Из документации Qt

Класс QByteArray предоставляет массив байтов.

QByteArray может использоваться для хранения как необработанных байтов (включая ‘\ 0), так и
традиционные 8-битные строки с символом \ 0. Использование QByteArray очень много
более удобно, чем использование const char *. За кулисами всегда
гарантирует, что за данными следует терминатор ‘\ 0’, и использует
неявное совместное использование (копирование при записи), чтобы уменьшить использование памяти и избежать
ненужное копирование данных.

0
По вопросам рекламы [email protected]