带有向量迭代器的程序中的分段错误

Posted

技术标签:

【中文标题】带有向量迭代器的程序中的分段错误【英文标题】:Segmentation Fault in program with vector iterators 【发布时间】:2013-04-15 00:29:24 【问题描述】:

谁能告诉我为什么它在 Visual Studio 中编译和运行良好,但在编译 GNU C++ 编译器时因分段错误而失败

我这辈子都想不通。我检查了前缀/后缀运算符,并确保将迭代器正确放置在条件语句中......我错过了什么?通常我在处理分配/解除分配动态数组时会遇到这个问题,我在这里没有这样做。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <random>
#include <unordered_set>

namespace std
    template <>
   struct hash<vector<int>> : public unary_function<vector<int>, size_t>
   
       size_t operator()(const vector<int>& v) const
       
           return v.size();
       
   ;


using namespace std;

struct testCase
    int n; 
    int m;
    vector <int> wordVector; 
;

bool lexOrderConfirm(std::vector<int>::const_iterator, std::vector<int>::const_iterator, std::vector<int>::const_iterator, int ); 

int main()     

int t; 

cin>>t;
vector <testCase*> testCaseVector(t);

for (int i = 0; i < t; ++i)

     testCaseVector[i] =  new testCase;

     cin>>testCaseVector[i]->n; 
        cin>>testCaseVector[i]->m;






         for (int i = 0; i < t; ++i)


            std::unordered_set<std::vector<int>, std::hash<std::vector<int> > >permutations;

             int permu = pow((double)testCaseVector[i]->n, testCaseVector[i]->m); 





int count = 0;



      for (int z= 0;  z < (permu*10); ++z)
      std::random_device rd;

    std::default_random_engine randomeng( rd() );
     int v;
      for (int b = 0; b < testCaseVector[i]->m; ++b)
     v= randomeng() % testCaseVector[i]->n + 1;   /*random number between 1 and n*/
     testCaseVector[i]->wordVector.push_back(v);
      
      std::sort(testCaseVector[i]->wordVector.begin(), testCaseVector[i]->wordVector.end());

      permutations.insert(testCaseVector[i]->wordVector);
      testCaseVector[i]->wordVector.clear();
      



      do 

           vector <int> test = *permutations.begin();

        do 
                std::vector<int>::const_iterator start = test.begin();
            std::vector<int>::const_iterator end;

                end = test.end();

            std::vector<int>::const_iterator lastElem = start+(testCaseVector[i]->m-1);


            if (lexOrderConfirm(start, end, lastElem, testCaseVector[i]->n))
                ++count;
            


        while(std::next_permutation(test.begin(),test.end()));

        permutations.erase(permutations.begin());
        test.clear();
      while(!permutations.empty());







  count = count%100000007;
        cout<<count<<endl;



         
    return 0;




bool lexOrderConfirm(std::vector<int>::const_iterator start, std::vector<int>::const_iterator end, std::vector<int>::const_iterator lastElem, int N)
  bool confirmed = true;

  for (std::vector<int>::const_iterator t = start; t != end; ++t)
                if ((2* (*t) > N))


                else if ((2*(*t) <= N) && (*(t+1) >= 2 * (*t)) && (t != (lastElem)))



                else
                    confirmed = false;
                    break;
               

    

  return confirmed;

【问题讨论】:

不应该将任何自定义类型或函数注入std 命名空间,否则您是在自找麻烦。此外,您发布了许多样板代码和格式错误的代码,但没有提供来自调试器的跟踪或至少一条错误消息。在这种情况下,没有人可以帮助你。重新设计您的问题。 【参考方案1】:

原因当然是你取消了一些未初始化的指针。从您当前的代码中无法分辨,因为一方面它取决于用户输入。 t = 2 对我来说似乎运行得很好;即使我不确定它是否按预期工作。

但是为什么它要在 Visual Studio 上运行呢?

因为VC++ 不会将指针初始化为 NULL。它正在工作,因为未初始化的指针所指向的东西在某种程度上就像初始化的指针一样工作。所以基本上是未定义的行为。

编译 GNU C++ 编译器时为什么会出现分段错误?

因为g++ 确实将指针初始化为NULL

【讨论】:

以上是关于带有向量迭代器的程序中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

带有向量和字符串的 C++ 分段错误

推送到成员向量时的段错误

访问算法的 lambda 函数中的迭代器导致我出现分段错误

C++:当我添加看似无关的代码行时,分段错误消失了

分段错误:在 C++ 中弹出向量时出现 11

在 C++ 中使用向量时出现分段错误