C 细分故障访问类数据成员,而无需明确使用指针

C++ Segmentation Fault accessing class data member without explicit use of pointers

本文关键字:指针 故障访问 细分 数据成员      更新时间:2023-10-16

注意:已经提出了类似的问题,但是我发现的几乎所有问题似乎都直接使用指针,这在这里可能无关紧要

对于这个代码段

#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函数中的一个数据成员时,我会发现一个分段故障。当它尝试打印sizetype时,也会发生这种情况。我无法辨别此内存问题的确切原因,并会提出任何建议或注意事项。

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将导致字符串复制两次(这对性能不利)。