我在项目的某些功能中添加了一些异常处理。在添加错误处理之前,程序正常运行。添加异常之后,我现在在构造函数和mutator参数中获得了垃圾值,但我不确定其来源。其中一些函数在构造函数之外的其他位置被调用,因此我不知道它们从何处获取垃圾数据。
我还使用valgrind检查内存泄漏,并使用gdb进行了一些调试,但没有找到任何东西。我机智。我在下面附加了一个构造函数cpp的示例,以及一个带有异常处理的变量。
Protofield.cpp
ProtoField::ProtoField(std::string t_name, std::string t_abbreviation, FieldType t_type, Base t_base, int t_mask, std::string t_description, int t_offset, int t_length){
try{
setName(t_name);
setAbbreviation(t_abbreviation);
setType(t_type);
setBase(t_base);
setMask(t_mask);
setDescription(t_description);
setOffset(t_offset);
setLength(t_length);
m_valueString = std::map<int, std::string>();
}
catch(std::runtime_error e){
std::cerr<<"Error in ProtoField Constructor"<<std::endl;
std::cerr<<e.what()<<std::endl;
return;
}
}
/*Removed for brevity*/
void ProtoField::setMask(int t_mask){
if(mask != 0){
std::stringstream ss;
ss<<"Field " << m_abbreviation << " mask previously set: "<<m_mask;
throw std::runtime_error(ss.str());
}
else{
m_mask = t_mask;
}
return;
}
/*Removed for brevity*/
ProtoField.hpp
class ProtoField{
private:
std::string m_name;
std::string m_abbreviation;
FieldType m_type;
Base m_base;
int m_mask;
std::string m_description;
int m_offset;
int m_length;
std::map<int, std::string> m_valueString;
public:
ProtoField(
std::string t_name = "",
std::string t_abbreviation = "",
FieldType t_type = FieldType::ft_invalid,
Base t_base = Base::invalid,
int t_mask = 0,
std::string t_description = "",
int t_offset = -1,
int t_length = -1
);
std::string getName();
std::string getAbbreviation();
FieldType getType();
Base getBase();
int getMask();
std::string getDescription();
int getOffset();
int getLength();
std::map<int, std::string> getValueString();
void setName(std::string t_name);
void setAbbreviation(std::string t_abbreviation);
void setType(FieldType t_type);
void setType(std::string t_typestr);
void setBase(Base t_base);
void setBase(std::string t_basestr);
void setMask(int t_mask);
void setDescription(std::string t_description);
void setOffset(int t_offset);
void setLength(int t_length);
void addValueString(int t_key, std::string t_value);
void removeValueString(int t_key);
//other functions
std::string to_string();
};
我觉得它也值得一提,只有整数似乎会受到影响。其他值(包括字符串和枚举)似乎与它们以前的行为保持一致。因此,在所示的类中,只有mask,offset和length表现出奇怪的行为。
编辑:要详细了解构造函数的调用位置,我在此处包括了我所知道的两个函数。
void parser::parseFields(ProtoData& t_data, ptree::ptree t_subtree){
try{
std::vector<ProtoField> fields;
for(auto val : t_subtree.get_child("")){
ProtoField field;
parseField(t_data, field, val.second);
fields.push_back(field);
}
for(auto field:fields){
t_data.addField(field);
}
}
catch(ptree::ptree_bad_path error){
std::cerr<<"Bad Path to Fields"<<std::endl;
}
catch(ptree::ptree_bad_data error){
std::cerr<<"Bad Data to fields"<<std::endl;
}
}
void parser::parseField(ProtoData& t_data, ProtoField& t_field, ptree::ptree t_subtree){
try{
t_field.setAbbreviation(t_subtree.get<std::string>("abbreviation"));
t_field.setName(t_data.getName() + "_" + t_field.getAbbreviation());
t_field.setBase(t_subtree.get<std::string>("base", "none"));
t_field.setType(t_subtree.get<std::string>("type"));
}
catch(ptree::ptree_bad_path error){
std::cerr<<"Bad Path to Field"<<std::endl;
}
catch(ptree::ptree_bad_data error){
std::cerr<<"Bad Data to field"<<std::endl;
}
}
答案 0 :(得分:0)
您的构造函数未初始化m_mask
。然后,您调用setMask
,它将读取此尚未初始化的值(假设if(mask != 0)
行应为if(m_mask != 0)
)。这是未定义的行为。读取的值可以是任何值。当它为非零值时,将引发异常。
解决方案是在调用m_mask
之前初始化setMask
,或者直接在构造函数中分配给m_mask
而不调用帮助函数。 (而且由于构造函数设置了只能执行一次的掩码,所以为什么甚至需要存在该函数?)