注意:已经提出了类似的问题,但是我发现的几乎所有问题似乎都直接使用指针,这在这里可能无关紧要
对于这个代码段
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
class Unit{
public:
string name;
char value;
vector<Unit> inner;
Unit(string Name){
name=Name;
}
Unit(char Value){
name="Character";
}
};
class Instruction{
public:
int size;
string type;
string value;
map<string, vector<Unit>> vars;
vector<Instruction> inner;
vector<Instruction> outer;
Instruction(string Type,string Value,vector<Instruction>& Outer,map<string, vector<Unit>> &Vars){
type=Type;
value=Value;
outer=Outer;
vars=Vars;
size=0;
}
Instruction(string Type,vector<Instruction>& Outer,map<string, vector<Unit>> &Vars){
type=Type;
outer=Outer;
vars=Vars;
size=0;
}
bool matches(vector<Unit> &info,int position=0, int vectLocation=0){
cout<<value<<'n'; //Segmentation Fault Occurs Here
return false;
}
};
void breakUp(vector<Unit>&u,string s){
for(int i=0;i<s.size();i++){
u.push_back(Unit(s[i]));
}
}
int main(){
//String to be matched
vector<Unit> v;
breakUp(v,"For the love of tests");
//Instruction Vector
vector<Instruction> i;
//Var Vector
map<string, vector<Unit>> x;
//Add initial instruction
Instruction constant("Constant","",i,x);
constant.inner.push_back(Instruction("String","For the love of tests",constant.inner,x));
//Test match
bool result=i[0].matches(v);
if(result==true){
cout<<"Match Truen";
}else{
cout<<"Match Falsen";
}
return 0;
}
尝试访问matches
函数中的一个数据成员时,我会发现一个分段故障。当它尝试打印size
或type
时,也会发生这种情况。我无法辨别此内存问题的确切原因,并会提出任何建议或注意事项。
vector<Instruction> i; ... bool result=i[0].matches(v);
i
是空的,因此访问i[0]
会产生未定义的行为。
sigsegv的原因似乎是
bool result=i[0].matches(v);
当您做
时vector<Instruction> i;
创建了一个新的std::vector
对象,尺寸为0。
现在,当您尝试通过上述语句访问第一个元素时,它可能会给出分段错误。
建议:
1)在构造函数中使用const std::string &
代替std::string
。使用std::string
将导致字符串复制两次(这对性能不利)。