2010-05-30 140 views
0

我正在使用MS Visual Studio。我一直在得到這個錯誤:如何解決錯誤「運行時檢查失敗#3」?

「運行時檢查失敗#3 - 正在使用變量'test'而未被初始化。」

我不知道如何解決這個問題。以下是我目前正在嘗試修改的代碼:

STDMETHODIMP CButtonDemoBHO::Exec(const GUID*, DWORD nCmdID, DWORD d, VARIANTARG*, VARIANTARG* pvaOut) 
{ 

    CRebarHandler *test; 

    switch (nCmdID){ 
    case BUTTON_PRESSED: 
     MessageBox(m_hWnd, L"You have pressed the button", L"Button Pressed", MB_OK); 
     test->findButton(m_hWnd); 
     test->setmenu(); 
     break; 

    case MENU_ITEM_SELECT: 
     MessageBox(m_hWnd, L"You have simulated a button press with the menu ", L"Menu Pressed", MB_OK); 
     break; 

    } 
    return S_OK; 
} 

回答

1

您聲明瞭測試,但從未向其分配任何內容。你有一個什麼都沒有的指針。那東西可能是NULL或任何東西。使用它來調用指針並不安全。

+0

在32位計算機上,NULL值只是2^32個可能值中的一個。根據以前使用'test'佔用的內存的情況,它的'NULL'可能小於1/1^32,但它仍然很低。 – sbi 2010-05-30 10:52:32

+1

這就是「或什麼」的意思。可以肯定的是,它指向一個有效對象的可能性是極其不可能的。 – Puppy 2010-05-30 17:54:21

2
CRebarHandler *test; 

switch (nCmdID){ 
    case BUTTON_PRESSED: 
    MessageBox(m_hWnd, L"You have pressed the button", L"Button Pressed", MB_OK); 
    test->findButton(m_hWnd); // <= using test without initialization 
    test->setmenu(); 
// ... 

在最後兩行中,您使用的是未初始化的test指針。由於它未初始化,它可能指向內存中的任何位置,並且它意外指向的塊將被解釋爲CRebarHandler對象。這是最好的未定義的行爲,並且可以做任何東西。很高興它立刻炸開。

我不知道CRebarHandler是什麼,但不能用一個作爲自動對象嗎?例如:

CRebarHandler test(/`...whatever it takes...*/); // no pointer 

switch (nCmdID){ 
    case BUTTON_PRESSED: 
    MessageBox(m_hWnd, L"You have pressed the button", L"Button Pressed", MB_OK); 
    test.findButton(m_hWnd); 
    test.setmenu(); 
// ... 
相關問題