首页 > 解决方案 > 没有显式使用指针的 C++ 分段错误访问类数据成员

问题描述

注意:已经提出了类似的问题,但我发现的几乎所有问题似乎都直接使用了可能与此处无关的指针

对于这段代码

#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 True\n";
    }else{
        cout<<"Match False\n";
    }

    return 0;
}

尝试访问matches函数中的一个数据成员时出现分段错误。当它尝试打印size或时也会发生这种情况type。我无法辨别此内存问题的确切原因,并会提出任何建议或考虑。

标签: c++segmentation-fault

解决方案


SIGSEGV 的原因似乎是

bool result=i[0].matches(v);

当你做了

vector<Instruction> i;

std::vector创建了一个大小为 0的新对象。

现在,当您尝试通过上述语句访问第一个元素时,可能会出现分段错误。

建议:

1)在构造函数中使用const std::string &而不是。std::string使用std::string将导致字符串被复制两次(这对性能不利)。


推荐阅读