【发布时间】:2011-03-30 03:35:20
【问题描述】:
在一个模拟逻辑门的程序中,我从使用数组切换
node N[1000];
到向量
vector<node> N;
而且我的程序在使用向量之前确实运行良好,但现在打印错误的结果,所以我尝试调试,发现错误发生在这里:
node* Simulator::FindNode(string h)
{
int i;
for(i = 0; i < NNodes; i++)
{
if (N[i].getname() == h)
{
return &N[i];
}
}
node n ;
N.push_back(n);
N[NNodes].setname(h);
NNodes++;
return &N[NNodes-1]; //why?because of NNodes++
}
// ...
node* inp1;
node* inp2;
node* out;
string NodeName;
inp_file >> NodeName;
inp1 = FindNode(NodeName);
s1 = inp1;
inp_file >> NodeName;
inp2 = FindNode(NodeName); //inp1 is destroyed here
inp_file >> NodeName;
out = FindNode(NodeName); //inp2 and inp1 are destroyed here
第一次调用FindNode 时,第一个指针inp1 指向正确的位置,即&N[0]。
第二次调用FindNode时,第一个指针inp1指向垃圾,第二个指针inp2指向正确的地方&N[1]。
当第三次调用FindNode 时,第一个和第二个指针(inp1、inp2)都指向垃圾!第三个指针指向正确的位置。
为什么会发生这种情况?
当我向它们插入项时,vector 是如何工作的,我应该使用哪种指针来指向 vector 项?
【问题讨论】:
-
我格式化了你的帖子。我还更改了您的代码,请在事物之间放置空格。执行:
for(i = 0; i < NNodes; i++)而不是for(i=0;i<NNodes;i++)或执行inp_file >> NodeName;而不是inp_file>>NodeName;,这样可读性更强。 -
我想建议您将 GMan 的答案标记为已接受。这是这里最全面的。
-
感谢大家特别是 GMan 和 Steven Sudit 的回答,现在我要学习和修改的太多了。