我已经在项目中使用这段代码很长时间了。但是,我最近将 llvm-config --cxxflags --libs 添加到编译器中,以便与 llvm 库链接,并且它开始生成 seg 错误。我已经找到了错误,当我调用基类的变量时,它发生了。
这是我正在做的一个小例子 在 Literals.hh
class LiteralObj : public RuleObj {
public:
LiteralObj();
LiteralObj(char *str);
~LiteralObj();
std::string raw_value;
static int literalobj_cnt;
int literalobj_id;
};
class LiteralIntObj : public LiteralObj{
public:
LiteralIntObj();
LiteralIntObj(char *str);
~LiteralIntObj();
void graphVis(std::ofstream &ofs, std::string &srcRef);
CODE_GENERATION;
int value;
};
文字.cc
LiteralObj::LiteralObj() : RuleObj(){
ENTER_STATEMENT
raw_value = "";
literalobj_id = literalobj_cnt;
literalobj_cnt++;
}
LiteralObj::LiteralObj(char *str) : RuleObj(){
ENTER_STATEMENT
std::cerr << ruleobj_id << "\n";
raw_value = str;
literalobj_id = literalobj_cnt;
literalobj_cnt++;
}
LiteralObj::~LiteralObj()
{
ENTER_STATEMENT;
}
LiteralIntObj::LiteralIntObj() : LiteralObj()
{
ENTER_STATEMENT;
value = 0;
}
LiteralIntObj::LiteralIntObj(char *str) : LiteralObj(str)
{
ENTER_STATEMENT;
std::cerr << ruleobj_id << '\n';
value = stoi(raw_value);
}
LiteralIntObj::~LiteralIntObj()
{
ENTER_STATEMENT;
}
void LiteralIntObj::graphVis(std::ofstream &ofs, std::string &srcRef) {
ENTER_GRAPHVIS;
// -- define names
std::string currRef = "LiteralIntObj";
std::string name = "LiteralInt";
std::cerr << raw_value << "\n";
//it crashes here with SEGFAULT.
}
对于第一个对象,代码可以很好地打印出基类的 raw_value,但是,当调用第二个对象时,会生成 SEGMENTATION 错误。
最佳答案
当我更改编译选项时,指针默认设置为 0xffffffff 而不是 0。因此,即使指针未初始化,检查 if (pointer)
也会生成 true,从而导致调用函数 graphViz()
.
关于c++ - 调用基类变量时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62993060/