分段错误 - 矢量字符串 - 多图实现

时间:2012-05-01 15:32:28

标签: c++ segmentation-fault

我尝试在C ++中实现多图的实现,但是在尝试访问向量“values”时遇到了seg错误,即使values.size()返回正确的答案。

我知道第22行发生了seg故障,但我不知道为什么。非常感谢任何帮助。

#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
template<class DT1,class DT2>
class Pair
{
public:
  Pair(DT1 key_in, DT2 value_in) 
  {
     key = key_in;
     values.push_back(value_in);
  }
  DT1 key;
  vector<DT2> values;
  int insert_value(DT2 item)
  {
     bool value_found = false;
     cout << "values size "<<values.size() << endl;

     cout << "test " << values[0] << endl;

     for (unsigned int i = 0; i < values.size(); i++)
     {
         cout <<"i " << i << endl;
         if (values[i] == item)     
            value_found = true;
     } 

  if (value_found == false)
  {
      cout<<"not found"<<endl;
      values.push_back(item);
  }

  return 0;
  }
};

template<class T1, class T2>
class MultiMap
{
public:
   MultiMap() {};
   vector<Pair<T1, T2> > pair_container;
   int insert(T1 key_in, T2 value_in)
   {
       bool key_found = false;
       unsigned int i;
       for (i = 0; i < pair_container.size(); i++)
       {
           if (pair_container[i].key == key_in)
       key_found = true;
       }   
       if (key_found == false)
           pair_container.push_back(Pair<T1,T2>(key_in, value_in));
       if (key_found == true)
       {
            pair_container[i].insert_value(value_in); // seg fault
       }
   return 0;
   }

   };

int main()
{
MultiMap<char, string> Map1;
Map1.insert('a', "anchor");
cout << Map1.pair_container[0].values[0] << endl;
Map1.insert('a', "application"); // seg fault
cout << "hello!"<<endl;
Map1.insert('b', "boolean");
return 0;
}

2 个答案:

答案 0 :(得分:4)

找到正确的向量后,您需要break循环for

即:

   unsigned int i;
   for (i = 0; i < pair_container.size(); i++)
   {
       if (pair_container[i].key == key_in)
       {
           key_found = true;
           break; // If you don't break out, i will always be one larger than size().
       }
   }   

如果你没有突破,那么key_found将是true,但i将引用一个超过向量结尾的内容,因此你会遇到内存损坏问题导致分段错误。

答案 1 :(得分:0)

写作时

 cout << "values size "<<values.size() << endl;

您正在测试values包含的内容。但是当你写作

 cout << "test " << values[0] << endl;

你假设它包含的内容是正确的。

values中的第一个对象是什么?它似乎是段错误的原因。 让我举个例子。如果你有一个指针或引用的向量,我添加0x11,那么第一个输出将是1。但是0x11指向哪里?