c++ 代码工作正常,但进程以终止结束而不是 return 0
c++ code works properly but the process ends with termination instead return 0
我在代码块中编写了一个简单的 C++ 代码,并通过动态内存分配实现了堆栈和图形 classes。
我的代码工作正常并提供正确的输出,但最后它显示 ***.exe 已停止工作错误并在构建日志中显示 "Process terminated with status -1073741819"。
我尝试了 GNU gdb 6.8 调试器,但没有发现任何错误。
这个问题是在实现堆栈 class 之后出现的,所以这是我的代码,如果它可以帮助解决问题:
class stack
{
vertex* d;
int end;
public:
stack()
{
end=0;
d=NULL;
}
void create(int n)
{
d=new vertex[n];
}
vertex top()
{
return d[end];
}
void push(vertex y)
{
end++;
d[end]=y;
}
vertex pop()
{
end--;
return d[end+1];
}
~stack()
{
if (d!=NULL)
delete d;
}
};
- 顶点class也在堆栈之前声明。
- 对于某些输入,调试器说 "Program received signal SIGSEGV, Segmentation fault."
编辑:主要提问:
int main()
{
G graf;
graf.get();
stack tree;
tree.create(graf.q()-1);
int q=0;
int i=0;
int u=0;
while (u<graf.q()-1)
{
tree.push(graf.u[i]);
if (graf.u[i].r[0]->flag > 0 && graf.u[i].r[1]->flag > 0 && u>=q)
tree.pop();
else
{
u++;
if (graf.u[i].r[0]->flag==0)
q++;
if (graf.u[i].r[1]->flag==0)
q++;
graf.u[i].r[0]->flag++;
graf.u[i].r[1]->flag++;
cout << tree.top().r[0]->name << " - " << tree.top().r[1]->name << '\n';
}
i++;
}
return 0;
}
- 我什至尝试在 return 0 之前添加一个 cout 并打印我的文本。
您的代码有误:
void push(vertex y)
{
end++;
d[end]=y;
}
应该是:
void push(vertex y)
{
d[end]=y;
end++;
}
否则,第一个推送的项目会到达位置 1
而不是位置 0
。
此外,stack::top()
returns 下一项,而不是最后推送的:
vertex top()
{
return d[end];
}
应该是:
vertex top()
{
return d[end-1];
}
我很确定你的段错误是由于访问了未分配的内存,添加断言让程序在出现问题时通知你,比如:
class stack
{
vertex* d;
int cur;
int capacity;
public:
stack()
{
cur=0;
capacity=0;
d=NULL;
}
void create(int n)
{
assert( d == NULL );
capacity = n;
d=new vertex[n];
}
vertex top()
{
assert( cur != 0 );
return d[cur-1];
}
void push(vertex y)
{
cur++;
assert( cur < capacity );
d[cur]=y;
}
vertex pop()
{
assert( cur > 0 );
cur--;
return d[cur+1];
}
~stack()
{
if ( d != NULL )
delete [] d;
}
};
然后,再次 运行,您将看到您在哪里获得断言。
最后,检查vertex
复制构造函数是否正常工作,因为pushing/poping做了很多vertex
复制,如果这里有问题,可能会导致段错误。
我在代码块中编写了一个简单的 C++ 代码,并通过动态内存分配实现了堆栈和图形 classes。 我的代码工作正常并提供正确的输出,但最后它显示 ***.exe 已停止工作错误并在构建日志中显示 "Process terminated with status -1073741819"。 我尝试了 GNU gdb 6.8 调试器,但没有发现任何错误。
这个问题是在实现堆栈 class 之后出现的,所以这是我的代码,如果它可以帮助解决问题:
class stack
{
vertex* d;
int end;
public:
stack()
{
end=0;
d=NULL;
}
void create(int n)
{
d=new vertex[n];
}
vertex top()
{
return d[end];
}
void push(vertex y)
{
end++;
d[end]=y;
}
vertex pop()
{
end--;
return d[end+1];
}
~stack()
{
if (d!=NULL)
delete d;
}
};
- 顶点class也在堆栈之前声明。
- 对于某些输入,调试器说 "Program received signal SIGSEGV, Segmentation fault."
编辑:主要提问:
int main()
{
G graf;
graf.get();
stack tree;
tree.create(graf.q()-1);
int q=0;
int i=0;
int u=0;
while (u<graf.q()-1)
{
tree.push(graf.u[i]);
if (graf.u[i].r[0]->flag > 0 && graf.u[i].r[1]->flag > 0 && u>=q)
tree.pop();
else
{
u++;
if (graf.u[i].r[0]->flag==0)
q++;
if (graf.u[i].r[1]->flag==0)
q++;
graf.u[i].r[0]->flag++;
graf.u[i].r[1]->flag++;
cout << tree.top().r[0]->name << " - " << tree.top().r[1]->name << '\n';
}
i++;
}
return 0;
}
- 我什至尝试在 return 0 之前添加一个 cout 并打印我的文本。
您的代码有误:
void push(vertex y)
{
end++;
d[end]=y;
}
应该是:
void push(vertex y)
{
d[end]=y;
end++;
}
否则,第一个推送的项目会到达位置 1
而不是位置 0
。
此外,stack::top()
returns 下一项,而不是最后推送的:
vertex top()
{
return d[end];
}
应该是:
vertex top()
{
return d[end-1];
}
我很确定你的段错误是由于访问了未分配的内存,添加断言让程序在出现问题时通知你,比如:
class stack
{
vertex* d;
int cur;
int capacity;
public:
stack()
{
cur=0;
capacity=0;
d=NULL;
}
void create(int n)
{
assert( d == NULL );
capacity = n;
d=new vertex[n];
}
vertex top()
{
assert( cur != 0 );
return d[cur-1];
}
void push(vertex y)
{
cur++;
assert( cur < capacity );
d[cur]=y;
}
vertex pop()
{
assert( cur > 0 );
cur--;
return d[cur+1];
}
~stack()
{
if ( d != NULL )
delete [] d;
}
};
然后,再次 运行,您将看到您在哪里获得断言。
最后,检查vertex
复制构造函数是否正常工作,因为pushing/poping做了很多vertex
复制,如果这里有问题,可能会导致段错误。