2016-02-01 85 views
0

我正在研究QNX/Blackberry 10應用程序。我的應用程序最近開始崩潰。插入跟蹤語句導致我相信在以下情況下會發生崩潰。我的QNX/BB10 C++應用程序崩潰,一個簡單的C++對象似乎已損壞

我的客戶端應用程序調用一個內部函數,並將它傳遞給一個C++類對象。傳遞的C++類如下所示:當我訪問_computerName_uuidDevice成員變量調用函數返回後出現

class ALPeerData 
{ 
public: 
    ALPeerData(); 
    virtual ~ALPeerData(); 

    int   _peerId; 
    ALModelType _modelType; 
    std::wstring _computerName; 
    std::wstring _uuidDevice; 
    . . . 
}; 

崩潰。被調用函數中的跟蹤顯示ALPeerData對象成員變量符合預期。因此,該函數內的_computerName.size()返回一些合理的東西,例如10,但在客戶端應用程序中調用時返回的大小約爲23 MB。 The ALPeerData對象似乎已損壞。

我在這裏列出了文檔的原因QCC -V輸出:

user:~$ qcc -V 
cc: targets available in /home/bbndk/host_10_3_1_12/linux/x86/etc/qcc: 
     4.6.3,gcc_ntoarmv7le_gpp 
     4.6.3,gcc_ntox86_gpp 
     4.6.3,gcc_ntoarmv7le_cpp-ne 
     4.6.3,gcc_ntoarmv7le_cpp 
     4.6.3,gcc_ntox86  (default) 
     4.6.3,gcc_ntoarmv7le 
     4.6.3,gcc_ntox86_cpp-ne 
     4.6.3,gcc_ntox86_cpp 
     4.8.3,gcc_ntoarmv7le_gpp 
     4.8.3,gcc_ntox86_gpp 
     4.8.3,gcc_ntoarmv7le_cpp-ne 
     4.8.3,gcc_ntoarmv7le_cpp 
     4.8.3,gcc_ntox86 
     4.8.3,gcc_ntoarmv7le 
     4.8.3,gcc_ntox86_cpp-ne 
     4.8.3,gcc_ntox86_cpp 
user:~$ 

可能是什麼毛病我ALPeerData類?

回答

0

事實證明,QNX在其gcc/qcc編譯器中實現C++標準時存在問題。

ALPeerData的析構函數聲明中的'virtual'關鍵字不是必需的和多餘的,因爲我的應用程序中沒有任何類派生它。這應該沒有什麼區別 - 我應該被允許爲我所要的任何析構函數指定'虛擬'。

實際上,爲ALPeerData的析構函數指定'虛擬'會導致生成不正確的二進制代碼。因此,訪問成員變量會導致垃圾結果。

當我刪除多餘的'虛擬'關鍵字時,崩潰消失了。

這不是我第一次遇到QNX實現C++虛擬析構函數的問題。第一次可以在previous StackOverflow post of mine中看到。

底線:對QNX的虛擬析構函數的實現需要警惕。

+0

我不明白。如果你的主類不是從其他派生的,爲什麼你聲明析構函數是虛擬的。 –

+0

我添加了'虛擬'關鍵字來幫助未來從ALPeerData派生的另一位開發人員。使其虛擬化避免了基礎析構函數沒有被調用的常見錯誤。根據官方C++規範,這是完全良性的。請參閱http://stackoverflow.com/questions/300986/when-should-you-not-use-virtual-destructors關於使所有析構函數變爲虛擬的討論。 另一個理論場景:假設派生類_had_是從ALPeerData派生的,但後來在重構期間從代碼中移除,而沒有從ALPeerData中刪除虛擬關鍵字。 –

+0

Ahhhhhhhhh .......我明白了。 Muchas gracias,阿米戈。 –