C++ 在C+中使用STL实现DFS时遇到分段错误+; V=V; adj=新列表[V];//将V列表动态分配给名为adj的数组 } void图::addEdge(int v,int w) { adj[v]。推回(w);//将w添加到v的列表中 } void图::initializeGraph() { 时间=0; 对于(int j=0;j

C++ 在C+中使用STL实现DFS时遇到分段错误+; V=V; adj=新列表[V];//将V列表动态分配给名为adj的数组 } void图::addEdge(int v,int w) { adj[v]。推回(w);//将w添加到v的列表中 } void图::initializeGraph() { 时间=0; 对于(int j=0;j,c++,algorithm,graph,stl,depth-first-search,C++,Algorithm,Graph,Stl,Depth First Search,第一步是读取所有编译器警告(并在打开警告的情况下编译) 例如: int entry_time[] ,exit_time[] , parent[] ; 这些数组的定义没有大小-但您正在将数据放入其中。这意味着您正在数组边界之外写入,这会导致未定义的行为(例如,您看到的崩溃和双重释放)。或者像为adj那样为这些数组分配空间,或者使用另一个容器(例如vector)您可以根据需要调整其大小 另外,edge\u classification并不总是返回值-您的编译器应该警告您这一点 编辑:更多关于

第一步是读取所有编译器警告(并在打开警告的情况下编译)

例如:

   int entry_time[] ,exit_time[] , parent[] ;
这些数组的定义没有大小-但您正在将数据放入其中。这意味着您正在数组边界之外写入,这会导致未定义的行为(例如,您看到的崩溃和双重释放)。或者像为
adj
那样为这些数组分配空间,或者使用另一个容器(例如
vector
)您可以根据需要调整其大小

另外,
edge\u classification
并不总是返回值-您的编译器应该警告您这一点

编辑:更多关于
std::vector

您不能将数组声明为
entry\u time[V]
,因为
V
的值在编译时是未知的。您可能有许多大小不同的
Graph
对象

如果将数组更改为
std::vector
,则可以在
Graph
构造函数中分配它们的大小,并让
std::vector
类负责分配和释放内存

例如:

   int entry_time[] ,exit_time[] , parent[] ;
在类中将
entry\u time
声明为
std:vector

std::vector<int> entry_time;
请注意,您可以在此处使用
V
作为参数来调整大小,因为这是在运行时进行的,所以现在它有一个值

std::vector
有一个类似于访问器的普通数组,因此您可以像分配数组一样将值分配到向量的条目中。例如,您现有的代码仍然可以工作:

entry_time[v] = time ;

以下是我的想法:
entry\u time
…是不允许使用的未指定类型的数组,但您可能正在使用允许使用该类型的gcc/g++。我从未使用过这些数组,但当我将它们更改为动态数组(如
adj
)时,没有分段错误。为什么不使用
std::vector
而不是这些非标准empty数组和邻接列表的
std::vector
?您正在使用
std::list
,那么为什么不也使用
std::vector
?这是您使用@PaulMcKenzie的代码。非常感谢。嗨@PaulMcKenzie!我正在查看您的代码,我有一些疑问:1)您好@The Dark!谢谢您的评论。最初我想定义这些大小为V的变量:int entry_time[V],exit_time[V],parent[V],但编译器给了我其中两个错误1)错误:无效使用非静态数据成员'Graph::V'int V;//顶点数2)错误:从此位置int entry_time[V],exit_time[],parent[];是否有任何方法可以在类图中定义这些大小为V的数组。学习使用
std::vector
@Dark我使用“new int[V]”和“new bool[V]为所有这五个变量分配了内存“。这很有效。谢谢。@sakshamjindal使用
std::vector
——您使用
new[]
而不使用
delete[]
创建内存泄漏。此外,使用
new[]
,您不会得到运行时边界检查,而您可以使用
std::vector::at()
。请参阅我在主要帖子中的评论,其中有一个使用
std::vector
的示例链接。非常感谢您让我熟悉与
new[]
相关的内存泄漏。我刚刚读了更多关于vector的内容,并将在黑暗中使用它。vector简介有帮助。谢谢!
entry_time[v] = time ;