C++ 分段故障(堆芯转储)错误C++;递归调用
我有一个4个顶点的循环图 每个节点都与一条边相关联,我将其存储在一个名为nodelabel的映射中 我正在尝试调用printAll(intsource,intdepth),它将为我提供从源节点到深度长度的路径(偏移量0到节点大小) 当深度达到650时,运行良好。当我给出printAll(2800)时,它给出了分段错误 我已经调试过,错误来自printAllPathsUtil函数……有人能告诉我发生分段错误的原因吗C++ 分段故障(堆芯转储)错误C++;递归调用,c++,heap,stack-overflow,heap-memory,C++,Heap,Stack Overflow,Heap Memory,我有一个4个顶点的循环图 每个节点都与一条边相关联,我将其存储在一个名为nodelabel的映射中 我正在尝试调用printAll(intsource,intdepth),它将为我提供从源节点到深度长度的路径(偏移量0到节点大小) 当深度达到650时,运行良好。当我给出printAll(2800)时,它给出了分段错误 我已经调试过,错误来自printAllPathsUtil函数……有人能告诉我发生分段错误的原因吗 Graph g(4); // 4 nodes g.addEdge(0, 1); g
Graph g(4); // 4 nodes
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.addLabel(0, "AAGT");
g.addLabel(1, "CCTC");
g.addLabel(2, "TTCC");
g.addLabel(3, "CTC");
map < int, string > nodelabel; // Map containing Nodelabel corresponding to every node id
void Graph::addLabel(int v, string s) {
nodelabel[v] = s; // Add w to v’s list.
}
void Graph::printAllPaths(int source, int depth) {
string kmerpath;
int * path = new int[V];
int path_index = 0; // Initialize path[] as empty
// Call the recursive helper function to print all paths
for (int offset = 0; offset < nodelabel[source].length(); offset++) {
printAllPathsUtil(source, offset, depth, path, path_index, kmerpath, 1);
path_index = 0;
}
}
void Graph::printAllPathsUtil(int u, int offset, int d, int path[], int & path_index, string kmerpath) {
path[path_index] = u; // store Current node in the path[]
path_index++;
if (d == 0) {
//cout << kmerpath << endl;
} else if ((nodelabel[u].length() - offset) >= d) {
kmerpath.append(nodelabel[u].substr(offset, d));
printAllPathsUtil(u, offset, 0, path, path_index, kmerpath);
} else // If current vertex is not destination
{
// Recur for all the vertices adjacent to current vertex
list < int > ::iterator i;
kmerpath.append(nodelabel[u].substr(offset, (nodelabel[u].length() - offset)));
for (i = adj[u].begin(); i != adj[u].end(); ++i) {
printAllPathsUtil( * i, 0, (d - (nodelabel[u].length() - offset)), path, path_index, kmerpath);
}
}
path_index--; // Remove current vertex from path[]
}
图g(4);//4节点
g、 增补(0,1);
g、 增补(0,2);
g、 增补(2,0);
g、 增编(2,3);
g、 增编(3,3);
g、 添加标签(0,“AAGT”);
g、 addLabel(1,“CCTC”);
g、 addLabel(2,“TTCC”);
g、 添加标签(3,“CTC”);
映射nodelabel;//包含对应于每个节点id的Nodelabel的映射
void图形::addLabel(int v,字符串s){
nodelabel[v]=s;//将w添加到v的列表中。
}
void图形::printallpath(int源、int深度){
字符串kmerpath;
int*path=newint[V];
int path_index=0;//将路径[]初始化为空
//调用递归助手函数以打印所有路径
对于(int offset=0;offset
有时,当使用递归与循环时,并不总是很清楚。递归通常被认为更为复杂,并且经常与函数式编程相关联,目的是非常线程安全。但是,如果递归太深,可能会很快耗尽堆栈内存
假设您有一个简单的函数:
char* foo()
{
char a[100000];
memset(a, 0, 100000);
return a;
}
程序知道在被调用时要分配多少内存(100000字节,外加一点指令)
如果您从其他地方调用foo()
,则程序知道将foo()
的内存分配给bar()
加上一点bar()
char bar()
{
if (condition)
{
return foo() + bar();
}
else return 0;
}
但是,如果您使bar()
递归,那么程序实际上不知道要分配多少,因为它不知道要分配多少次。这是一个合理的猜测,但是如果超出了猜测所支持的深度,那么就会出现堆栈溢出
解决方案是在深度过深时循环:
char bar()
{
char* a;
while (condition)
{
a += foo();
}
return a;
}
在这种情况下,我们失去了设计的功能方面,但我们一次只调用foo()
,因此每次重置循环时都会再次释放内存
我希望这个解释是有帮助和正确的。我知道函数没有什么意义,但希望能给你一个想法。你在C++中编程,你写的就是你。那你为什么把这个问题标为C?C和C++不是同一种语言,不要混淆它们。抱歉。我想有C知识的人也可以在这方面帮助我。@rombi“有人能告诉我发生分段错误的原因吗?”堆栈溢出?当你使用递归时,这是最有可能的。尝试用循环ANSAstd::stack
@πάντα替换递归ῥεῖ 显示分段故障(堆芯倾倒)。您是否认为存在堆栈溢出错误。如果是,那么如何纠正?@rombi“那么如何纠正?”我已经解释过:不要使用递归。
char bar()
{
char* a;
while (condition)
{
a += foo();
}
return a;
}