【问题标题】:How to resolve error "Run-Time Check Failure #3"?如何解决错误“运行时检查失败 #3”?
【发布时间】:2011-02-25 15:57:12
【问题描述】:

我正在使用 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;
}

【问题讨论】:

    标签: visual-c++


    【解决方案1】:
    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();
    // ...
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 在 32 位机器上,NULL 只是 2^32 个可能值之一。根据之前使用的内存test现在占用的内存,它是NULL的概率可能小于1/1^32,但仍然很低。
      • 这就是“或任何东西”的用途。可以肯定的是,它指向一个有效对象的可能性极小。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      相关资源
      最近更新 更多