2012-11-20 106 views
1

錯誤的行爲我有一個問題,從一個類返回從兩個函數的const char*,由於某種原因的第一個值是第二值的副本或一些值是不對的,但同時返回值是從不同的指針,在此情況下,兩個QMap,下面是兩個函數的代碼:爲const char * Qt中

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->signalsQMap<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 ::連接

Object::connect: Use the SLOT or SIGNAL macro to connect NovaRadioButton:: rc 

我填的是QMap s是一些功能有:

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

我不知道我做錯了,或者也許是Qt的函數中的錯誤從QString,感謝您的幫助。

回答

5

當你的函數退出時,ba對象被銷燬。您返回的指針指向不再存在的對象的內存位置內部。這是返回指針的基本(和衆所周知的)錯誤當地人:

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

,你正在處理一個QByteArray中,這一事實並不重要;它仍然是一個自動的局部變量,因此在函數退出時被破壞。

而應該直接返回一個QByteArray中,而不是char*。這仍然是有效的,因爲QByteArray使用implicit sharing

+0

謝謝你,但不是另一種方式?我返回const char *因爲我用它的QObject ::連接(QObject *發射器,常量字符*信號,QObject *接收器,常量字符*槽);所以我想要的是在函數中模擬SIGNAL和SLOT宏,或者如果有另一種方式,我知道我可以返回一個QByteArray並使用.data(),但是如果可能,我想模擬一個SIGNAL和SLOT宏。 –

+0

@DiegoFernandoMurilloValenci在評論中回答太複雜。發表一個新的問題:) –

+0

是的,我做到了,謝謝[鏈接](http://stackoverflow.com/questions/13485841/how-to-implement-the-macros-signal-and-slot-as-功能-qt)的 –

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 
} 
0

QByteArray應首選char*。來自Qt文檔

QByteArray類提供了一個字節數組。

QByteArray可用於存儲原始字節(包括'\ 0's')和 傳統的8位'\ 0'終止的字符串。使用QByteArray比使用const char *更方便 。在幕後,它總是 確保數據之後是「\ 0」終止子,並使用隱式 共享(寫入時複製),以減少存儲器的使用和避免數據不必要 複製。