我尝试在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;
}
答案 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
指向哪里?