我有以下代码:
CrowdSim::Simulation my_simulation;
void printstring(std::string filename)
{
std::cerr<<"filename= " <<filename<<std::endl;
}
int main(int argc, char* argv[])
{
std::vector<std::string> tokens;
std::string filename = "";
if(argc > 1)
{
std::string args(argv[1]);
split(tokens, args, is_any_of("\"="), token_compress_on);
filename = tokens.at(1);
}
my_simulation = CrowdSim::Simulation();
printstring(filename);
我使用以下
运行程序./CrowdSim -filename="Layout/layout_1"
在gdb中,我在printstring(filename)
之前放置一个断点。点击此断点时,我执行print filename
,输出为"Layout/layout_1"
。在输入printstring
(踩到step
)后,我立即print filename
,结果为""
。
但是,如果我实际让下一行运行,输出就可以了:它打印filename= Layout/layout_1
。这是某种gdb错误吗?如果不使用大量的cerr
语句,它就很难调试。可能导致这种情况的原因是什么?
此外,如果我注释掉涉及my_simulation
的所有行(以便它永远不会被初始化并且我从不使用它),我在步入printstring
时会收到错误:
printstring (filename=Traceback (most recent call last):
File "/usr/share/gdb/python/libstdcxx/v6/printers.py", line 469, in to_string
return self.val['_M_dataplus']['_M_p'].string (encoding, length = len)
RuntimeError: Error reading string from inferior: Input/output error
) at Source/main.cc:13
我还使用仅包含上述main
和printstring
函数的程序对此进行了测试,没有引用任何其他对象。上述错误仍然存在。
任何人都可以向我解释这些错误吗?另外,在c ++中有些相关,行CrowdSim::Simulation my_simulation
是否自动调用构造函数,因此我不再需要行my_simulation = ...
?在Java中,声明一个变量并不构造它(据我所知),所以这两行通常是必要的(我认为)。