为什么编译器没有在C ++ Builder中编译一行?

时间:2010-02-08 14:26:54

标签: c++ c++builder

我在C ++ Builder 6中编写了一个应用程序,我遇到了这个罕见的问题:

void RotateDice()
{
  Graphics::TBitmap *MYbitmap = new Graphics::TBitmap();

  Randomize();
  int rn = random(6) + 1;

  switch (rn)
  {
    case 1:
    {
        //...
        break; 
    }
    //...  Some cases...
  }

  ShowDice();  //it's a function to show the dice
  delete MYbitmap;   //the compiler don't get it!!!!
}

在“ShowDice()”行中,编译器跳转到RotateDice()方法的最后,它没有“看到”“删除MYbitmap”行。当我编译程序时,每个编译的行在其左侧显示一个蓝点,但该行不显示蓝点......就像编译器没有“看到”代码行。发生了什么????

注意:前几天,我正在Delphi编写一个程序,我对这个有问题的问题提出了建议。有些像在Delphi 7中发生的那样...那么,问题就是这个?

我很抱歉我的英语。我来自古巴。

5 个答案:

答案 0 :(得分:3)

由于ShowDice();调用不依赖于MYbitmap变量,编译器可以自由地重新排序最后两个语句。这可能解释了为什么你没有“命中”调试器中的行。停用优化,然后重试。

此外,我是否可以建议使用RAIIstd::auto_ptr之类的boost::scoped_ptr包装而不是手动内存管理?

答案 1 :(得分:2)

据我了解您的问题,当您跟踪应用程序时,调试器会“跳过”delete MYbitmap;行?

  1. 尝试在此行中添加断点。如果它没有标记,我们有奇怪的IDE错误。

    ShowDice();
    delete MYbitmap;
    int a = 0; // try to add this dummy line and debug again
    
  2. 也许ShowDice();会抛出异常?然后你永远不会到达这条线。尝试捕获所有异常并打印结果。如果是这种情况,您的代码应类似于:

    try {
       ShowDice();
    }
    catch(...) {  // catch all exceptions and do something with them
       delete MYbitmap;
       throw;
    }
    delete MYbitmap;
    

答案 2 :(得分:1)

编译时是否启用了优化?优化有一种方法可以使代码在调试器下执行时非常混乱。尝试完全重新编译,调试信息和优化完全禁用,就像测试一样。

答案 3 :(得分:0)

你可以尝试:

void RotateDice()
{
  Graphics::TBitmap MYbitmap;
  ...

  ShowDice();
  // No delete needed
};

在堆栈上创建TBitmap意味着C ++被强制删除它,即使ShowDice()抛出异常。

这适用于C ++ Builder 6吗?

答案 4 :(得分:0)

C ++ Builder 6编译器有一个错误,在使用这些结构时很少显示出来:

1)

if(condition)
{
    <somecode>
    break;
}

2)

if(condition)
{
    <somecode>
    continue;
}

3)

if(condition)
{
    <somecode>
    goto label;
}

这里,“somecode”将始终被跳过或始终运行而不考虑条件评估的结果。删除“继续”,“中断”或“转到”时,问题就解决了。似乎带有中断的switch语句也可能具有这样的“特性”。 尝试以这种方式在glitched行之前更改代码:

if(rn == 1)
{
        //...
}
   //...  other cases...
else if(rn == ...)
{
   //... 
}
ShowDice();  //it's a function to show the dice
delete MYbitmap;   //works?