2010-01-21 50 views
0

我有一個複雜的錯誤。該軟件將PrintParamters發送給打印機幾次。在某個時刻,參數結構的所有QStrings都被破壞(壞ptr)爲什麼QString在struct中有時是bad-ptr?

Structs中是否存在QStrings的一般問題?

這裏是我使用的結構:

typedef struct RecorderPrintParam { 
    ES_DataType xxxxxxxxxx; 
    bool xxxxxxxxxxx; 
    bool xxxxxxxxxxxx; 
    bool xxxxxxxxxxxx; 
    int  xxxxxxxxxxxxxxxxxxxxxx; 
    double xxxxxxxxxxxxxxx; 
    double xxxxxxxxxx; 
    bool  xxxxxxxxxxx; 
    int xxxxxxxxxxxxxxx; 
    double xxxxxxxxxxx; 
    bool  xxxxxxxxxxx; 
    bool xxxxxxxxxx; 
    double xxxxxxxxx; 
    QString xname; 
    QString yname; 
    QString anotherValue; 
    QString opername; 
    QString region; 
    QString application; 
    QString version; 
    AxisUnit axUnit ; 
    double axLenM; 
    double xxxxxxxx; 
    double xxxxxxxx; 

    int  xxxxxxxx; 
    double xxxxxxxxx; 
    double xxxxxxxxx; 

    bool xxxxxxxxxxxxxxx;/

    double xxxxxxxxxxxxxxx; 

    double xxxxxxxxxx; 
    bool xxxxxxxxx; 

}RecorderPrintParam; 

這裏是如何的結構是使用: 從GUI級稱爲:

void 
MyDlg::UpdateRecorderPrintParameters() 
{ 
     RecorderPrintParam param; 
     .... 
     .... 
     param.xname = QString("abc def 123"); 
     _recorder->setParam(&param); 
} 

param.xname已經有一個不好ascii ptr! ? 我也嘗試使用just =「abc def 123」而不是= QString(「abc def 123」);但它的出現同樣的錯誤

這是通過setParam職能的樣子:

RecorderInterface::setParam(RecorderPrintParam *up) 
{ 

.... 
... 
if(up->xname.compare(_myParams.xname)!=0) _newHeaderPrint=true; 
... 
... 
} 

} 

的XName仍具有在那一刻「8xname = {d = 0x08e2d568}」的地址,但xname.ascii有一個00000000指針

+0

您還應該發佈顯示您如何使用此結構的代碼。例如它是動態分配的嗎? – Alon 2010-01-21 08:39:43

+0

好的,我更新了我的帖子 – Christoferw 2010-01-21 08:51:18

+0

基於這些信息的任何想法? – Christoferw 2010-01-21 09:15:47

回答

4

要在堆棧創建結構:RecorderPrintParam param 然後就通過這一結構的地址給另一個函數_recorder->setParam(&param);

UpdateRecorderPrintParametersë xits param超出範圍並且其內容變得無效。它分配在堆並釋放它,當該GUI被使用其值,完成 或通過param通過值setParam

UPDATE有與此代碼以這種方式創建的字符串一個額外的問題:

QString("abc def 123"); 

創建臨時對象,其參考是由重載QString=操作者 C++標準說(12.1)

返回

臨時綁定到參考 參數在函數調用中持續存在 直到完成包含調用的完整 表達式。

所以對於QString("abc def 123")對象的析構所述param對象被傳遞到setParam

嘗試之前被調用來改變的QString( 「ABC DEF 123」),以QString的STR( 「ABC DEF 123」); 和param.xname = str;param.xname = "abc def 123"

+0

我已經測試過通過參數的值,但它導致了同樣的錯誤:( – Christoferw 2010-01-21 09:31:59

+0

param.xname =「abc def 123」 - >我已經測試了這個,這會導致同樣的錯誤..我以爲相同..... – Christoferw 2010-01-21 14:10:16

+1

我能想到的唯一的其他解釋是代碼的其他部分會破壞堆棧。 – Alon 2010-01-21 14:51:31

相關問題