У меня проблема с возвратом 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
Я заполняю QMap
s это некоторая функция с:
signals.insert(methodname,QString(metamethod.signature()));
Я не знаю, что я делаю неправильно или, может быть, это ошибка в функциях Qt из QString
, Спасибо за вашу помощь.
Когда ваши функции выходят, ba
объекты уничтожены. Указатели, которые вы возвращаете, указывают внутри ячеек памяти уже не существующих объектов. Это основная (и общеизвестная) ошибка возврата указателей местным жителям:
char* foo()
{
char c = 'a';
return &c;
}
Тот факт, что вы имеете дело с QByteArray, не имеет значения; это все еще автоматическая локальная переменная, которая уничтожается при выходе из функции.
Вместо этого вы должны возвращать QByteArray напрямую, а не char*
, Это все еще эффективно, так как QByteArray использует неявное разделение.
Нет ошибок, вы возвращаете указатель на внутренности объекта, который был уничтожен.
Перепиши свои функции вот так
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
}
QByteArray
должно быть предпочтительнее char*
, Из документации Qt
Класс QByteArray предоставляет массив байтов.
QByteArray может использоваться для хранения как необработанных байтов (включая ‘\ 0), так и
традиционные 8-битные строки с символом \ 0. Использование QByteArray очень много
более удобно, чем использование const char *. За кулисами всегда
гарантирует, что за данными следует терминатор ‘\ 0’, и использует
неявное совместное использование (копирование при записи), чтобы уменьшить использование памяти и избежать
ненужное копирование данных.