我在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中发生的那样...那么,问题就是这个?
我很抱歉我的英语。我来自古巴。
答案 0 :(得分:3)
由于ShowDice();
调用不依赖于MYbitmap
变量,编译器可以自由地重新排序最后两个语句。这可能解释了为什么你没有“命中”调试器中的行。停用优化,然后重试。
此外,我是否可以建议使用RAII或std::auto_ptr
之类的boost::scoped_ptr
包装而不是手动内存管理?
答案 1 :(得分:2)
据我了解您的问题,当您跟踪应用程序时,调试器会“跳过”delete MYbitmap;
行?
尝试在此行中添加断点。如果它没有标记,我们有奇怪的IDE错误。
ShowDice();
delete MYbitmap;
int a = 0; // try to add this dummy line and debug again
也许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?