2014-04-08 42 views
1

再次「純虛擬方法稱爲錯誤」,我查了其他類似的問題,他們不能解決我的問題。 我有一個與提到的消息崩潰。我不做任何華麗的員工。該代碼是大,所以只有重要的提取物:純粹的虛擬方法稱爲錯誤和崩潰

class cCOLLECT_STR_NODES_HELPER 
{ 
    protected: 
    cCOLLECT_STR_NODES_HELPER(const std::string& searchStr, 
          const int attribute, 
       const cGTI_SRCH_TREE_NAME_DLG *pDlg) 
    : m_compareStr(searchStr), m_attr(attribute), pSrchDlg(pDlg) {} 

    virtual ~cCOLLECT_STR_NODES_HELPER() {} 

    public: 
    virtual bool TreatTheNode(const cGTC_TREE_NODE *curNode) = 0; 
... 
} 

然後去派生類:

class cCOLLECT_STR_TOP_NODES_HELPER : public cCOLLECT_STR_NODES_HELPER 
{ 
    public: 
    cCOLLECT_STR_TOP_NODES_HELPER(const std::string& searchStr, 
           const int attribute, 
        const cGTI_SRCH_TREE_NAME_DLG *pDlg) 
    : cCOLLECT_STR_NODES_HELPER(searchStr, attribute, pDlg) {} 

public: 
virtual bool TreatTheNode(const cGTC_TREE_NODE *curNode); 
... 
} 

TreatTheNode()分別實現:

bool cCOLLECT_STR_TOP_NODES_HELPER::TreatTheNode(const cGTC_TREE_NODE *curNode) {... 

然後派生類初始化:

cCOLLECT_STR_NODES_HELPER *pHelper; 

    cCOLLECT_STR_TOP_NODES_HELPER helper(searchStr, attribute, this); 
    pHelper = &helper; 

然後pHelper傳入函數並在那裏使用:

TraverseTreeNodes(const cGTC_TREE_NODE *curNode, 
       cCOLLECT_STR_NODES_HELPER *pHelper) const 
{ 
if (pHelper->TreatTheNode(curNode)) => CRASH 

該項目已成功構建。怎麼了?

+0

你使用什麼編譯器?我懷疑pHelper是零,這就是吹了... –

+0

@Nathan Monteleone對不起,發現從側面的錯誤。不,它不是空的。 –

+0

'項目成功建成。'嘆氣。爲什麼很多人提出一個問題來提出這個問題?只是因爲你的項目建立好並不意味着它會運行良好。其次,你做了什麼調試?第三,因爲你的程序很大,所以更有理由相信你的問題是從你沒有發佈的代碼開始的。 – PaulMcKenzie

回答

0

當我發現我身邊的一個錯誤並刪除了問題後,我決定取消刪除並部分回答。我相信其他人可以從這個愚蠢的錯誤中受益(當你在3個小時內有最後期限時會犯錯誤)。

我知道這是明顯的東西:其實我寫的代碼:

cCOLLECT_STR_TOP_NODES_HELPER helper(searchStr, attribute, this); 
pHelper = &helper; 

在現實情況是:

{ 
    cCOLLECT_STR_TOP_NODES_HELPER helper(searchStr, attribute, this); 
    pHelper = &helper; 
} 

所以幫手出去的範圍......

問題是,我做了調試。 pHelper指出了一些有意義的東西,至少 就是它的樣子。我仍不確定事故發生的具體情況,但原因很明顯。當指出的對象超出範圍時,可能是UB。 不過,如果有人描述內部發生的事情,我會接受答案。

+0

接受的答案在: http://stackoverflow.com/questions/20146111/avoiding-pure-virtual-function-call-in -derived-class-c?rq = 1 確認UB。 –

0

在這種情況下,您正面臨一個空指針問題,因爲您正在將未初始化的對象傳遞給參數,因此pHelper將沒有值,因此會嘗試崩潰程序。

+0

pHelper初始化:pHelper =&helper;它顯然不是空的。 –

+0

哎呦,我沒有看到。 –