【问题标题】:c++ std::vector Orphan Range errorc++ std::vector 孤立范围错误
【发布时间】:2011-04-28 13:45:53
【问题描述】:

一个处理图(来自图论)表示和转换的程序。邻接表和矩阵的实现就像向量的动态数组(不要问为什么不是向量的向量),因为以下函数程序退出时出现内存错误和指向孤立向量定义的编译器。

int vertex,edges;
vector<int> *adjacencyList,*adjacencyMatrix;

void listToAdMatrix(int vertexNumber, vector<int> *List, vector<int> *Matrix){
 int in=0,cont=0;
 for(int i=0;i<vertexNumber;i++){
  in=i;
  for(auto j=List[in].begin();j!=List[in].end();j++){
   for(int k=0;k<vertexNumber;++k){
    if(k==*j) Matrix[cont].push_back(1); 
    else Matrix[cont].push_back(0);
   }
   cont++;
  }
 }
}

//function call
//vertex(number) and ajacencyList are initialized

adjacencyMatrix=new vector<int>[vertex];
listToAdMatrix(vertex,adjacencyList,adjacencyMatrix);

编译器指向的 STL 中的“错误来源”:

http://i51.tinypic.com/2dt0t9e.jpg


错误信息:

graph.exe 中 0x001a543b 处的未处理异常:0xC0000005:访问冲突读取位置 0xfdfdfe01。


用于填充邻接表的fillList函数:

void fillList(int vertexNumber, vector<int> *List){
    int input=0;
    for (int i=0;i<vertexNumber;i++){   
        int in=i;
        cout<<"Introduce adjacent vertexes for the vertex -"<<i+1<<"-:"<<endl;
        for(int j=0;j<vertexNumber;j++){
            std::cout<<i+1<<"-";
            std::cin>>input;
            if(input==0) break;
            List[i].push_back(input-1);
        }
    }
}

欢迎提供任何线索。


【问题讨论】:

  • 请发布编译器错误信息或运行时错误,而不是调试器屏幕截图。
  • 我们需要查看更多您的代码。当我编译并运行它时(初始化顶点为10,并将adjacencyList初始化为相同大小的数组),没有错误。
  • @Space_C0wb0y 我不允许发布超过 2 个链接。但是这里是第二个屏幕 i52.tinypic.com/2u5ri3l.jpg>
  • @ilcreade:不要发布图片链接。使用复制/粘贴在此处发布实际文本。该网站旨在帮助您和其他可能遇到相同问题的人一样多。您的图片链接可能有一天会失效,从而使问题变得毫无用处。此外,图像使基于文本的搜索变得毫无用处。
  • 请发布您遇到的实际错误。

标签: c++ stl vector dynamic-memory-allocation


【解决方案1】:

问题已解决:

我又一次在数组之外读取。错误出现在 cont 变量中,我用来处理矩阵(动态数组)中的向量,当它超出array.问题通过插入while语句解决。谢谢大家的回答。

int vertex,edges;
vector<int> *adjacencyList,*adjacencyMatrix;

void listToAdMatrix(int vertexNumber, vector<int> *List, vector<int> *Matrix){
 int in=0,cont=0;
 for(int i=0;i<vertexNumber;i++){
  in=i;
  for(auto j=List[in].begin();j!=List[in].end();j++){
   while(cont!=vertexNumber){
     for(int k=0;k<vertexNumber;++k){
       if(k==*j) Matrix[cont].push_back(1); 
       else Matrix[cont].push_back(0);
     }
     cont++;
   }
  }
 }
}

//function call
//vertex(number) and ajacencyList are initialized

adjacencyMatrix=new vector<int>[vertex];
listToAdMatrix(vertex,adjacencyList,adjacencyMatrix);

【讨论】:

    【解决方案2】:

    你确定adjacencyList[in].size() 总是小于顶点吗?将代码放在j 循环之前进行检查。现在你只需要放置一个虚拟线和一个断点,看看它是否会发生。

    如果是这样,则 adjacencyList 初始化不正确,或者这是您需要处理的情况。

    您还需要确保将 adjacencyList 设置为长度为 vertex 的数组,但这更明显,所以您可能正在这样做。

    【讨论】:

    • 我检查过了,它通过了。邻接表初始化正确(我有打印功能)。
    【解决方案3】:

    一个问题是你还没有初始化 adjacencyList。根据这段代码,当它进入 listToAdMatrix 时,它应该指向垃圾(或 null)。尝试索引到 List[in] 时会导致错误。

    【讨论】:

    • 不,我有一个读取邻接列表的函数(在此之前我声明了列表)。问题在于转换。
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2012-12-13
    • 2011-08-30
    • 2015-08-26
    • 2011-07-17
    • 2015-12-15
    • 2012-04-10
    相关资源
    最近更新 更多