如何解决错误“运行时检查失败#3”?

时间:2010-05-30 10:37:12

标签: visual-c++

我正在使用MS Visual Studio。我一直在收到这个错误:

“运行时检查失败#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;
}

2 个答案:

答案 0 :(得分: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();
// ...

答案 1 :(得分:1)

您宣布测试,但从未为其分配任何内容。你有一个指向什么的指针。那东西可能是NULL或任何东西。用它来调用指针是不安全的。