c++ - 没有显式使用指针的 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
。我无法辨别此内存问题的确切原因,并会提出任何建议或考虑。
解决方案
SIGSEGV 的原因似乎是
bool result=i[0].matches(v);
当你做了
vector<Instruction> i;
std::vector
创建了一个大小为 0的新对象。
现在,当您尝试通过上述语句访问第一个元素时,可能会出现分段错误。
建议:
1)在构造函数中使用const std::string &
而不是。std::string
使用std::string
将导致字符串被复制两次(这对性能不利)。
推荐阅读
- django - Django 休息令牌认证
- postgresql - Postgresql - 语法错误 - 使用 table_name 作为
- java - JSON数据未显示,而是显示空白屏幕
- javascript - 如何创建外部按钮来操作单元格
- php - 如何使用特定列名作为数组索引获取特定列的结果?
- r - Shiny + downloadHandler + Openxlsx 不生成 xlsx 文件
- laravel - 队列工作人员的合适数量是多少?
- amazon-cloudfront - Prometheus 不会从 Cloudfront 抓取指标 - 时间戳问题?
- javascript - 通过函数将事件侦听器添加到克隆对象
- php - 默认条件下的断点