我正在研究VS 2010 express并尝试做一些文件阅读和解析工作
我的功能是这样的......(我放弃了无聊的部分)
void SomeClass::SomeFunc(char *ALName, std::map<...> *chromList, std::map<...> *chromLine)
{
ifstream file;
char tmpBuff[500];
char tmpBuff2[500];
char fileName[350];
char tmp[350];
char *pch;
char *pch2;
.....
file.open(fileName);
while ( file.getline( tmpBuff, 500 ) )
{
....
if ( some_condition == 0 )
{
pch2 = strtok( NULL, "," );
pch = strtok( NULL, "," );
(*chromList)[pch2] = do_some_work( atoi(pch), tmpBuff2 );
strcpy( tmp, get_chrom_line( tmpBuff2 ) );
(*chromLine)[pch2] = tmp;
}
}
file.close();
}
当我更改为Release with Optimization设置为Maximum speed时,将跳过此功能。 调试器进入函数并立即返回。
当我运行Debug设置或Release并将Optimization标志设置为disabled时,该函数运行正常。
可能的原因是什么? 我是否可以使用预处理器定义强制对此函数执行“无优化”,同时优化其余代码
谢谢! 伊丹
答案 0 :(得分:5)
您永远不应该尝试调试优化代码。它显示的行号很少与实际执行的内容相匹配,而忘记了读取局部变量。这就是“调试”和“发布”模式的原因。
但是,如果你真的想,try this使Visual Studio不能优化该功能。您还可以将该函数放在单独的源文件中,并以调试模式进行编译。
答案 1 :(得分:4)
你确定该函数实际上是被跳过的吗?调试器不是简单地让它看起来被跳过了吗?
如果它确实没有被执行,那么几乎可以肯定你有未定义的行为,当你没有优化时,它会如何工作,并且编译器(可能正确地)在优化模式下将其优化为非工作代码。
这就是说我看到了一些有问题的内容:您使用strtok
(旁边 - 在C ++ / C ++ 11中更喜欢NULL
或0
)来调用nullptr
而不调用它用有效的指针。您是否意识到strtok
具有破坏性?
然后使用字符指针索引数组,或者假设(希望?)使用operator[]
参数调用重载的char*
函数。
由于这是C ++,如果删除所有C样式的解析并使用string
和find
/ {{1}执行此操作,您的代码将更干净,更安全,并且可能更容易调试} / etc取决于您的需求。