gpt4 book ai didi

c++ - 需要帮助解决 C++ 中的 Scanner/Lexer 代码部分中的段错误

转载 作者:行者123 更新时间:2023-11-28 07:59:07 25 4
gpt4 key购买 nike

段错误是扫描码造成的。

问题:

使用GDB回溯发现问题出在声明FieldInfo指针field_info(其中FieldInfo是一个struct) 在条件中:if (tell_me).

请注意下面的代码是一个大文件的一部分,所以如果有些东西的声明没有在这里,你可以假设它们已经在程序的其他地方定义了,而没有在这里显示。

示例代码:

Some_function(some_arguments) {    
// Did something.

if (flag_1) {

list<const FieldInfo *> prefix_stack;

const FieldInfo def_pfx(NON_BOOLEAN, default_prefix);
{
const FieldInfo * default_field_info = &def_pfx;
if (default_prefix.empty()) {
map<string, FieldInfo>::const_iterator f = field_map.find("");
if (f != field_map.end()) default_field_info = &(f->second);
}

// We always have the current prefix on the top of the stack.
prefix_stack.push_back(default_field_info);
}

// Did something.

for (<some conditions>) {
bool tell_me = false;
// Did something.

if (tell_me) {
const FieldInfo pos_prefix(NON_BOOLEAN, pos);
const FieldInfo * field_info = &pos_prefix;
Term * term_obj = new Term(&state, term_lowercase, field_info,
term, stem_term, term_pos++);
Parse(pParser, token, term_obj, &state);
} else {
const FieldInfo * field_info = prefix_stack.back();
Term * term_obj = new Term(&state, term_lowercase, field_info,
term, stem_term, term_pos++);
Parse(pParser, token, term_obj, &state);
}

// Did something.
}
}

// Did something.
}

FieldInfo的定义是:

struct FieldInfo {
/// The type of this field.
filter_type type;

/// Field prefix strings.
list<string> prefixes;

/// Field processors struct already defined earlier.
list<FieldProcessor*> procs;

FieldInfo(filter_type type_, const string & prefix)
: type(type_)
{
prefixes.push_back(prefix);
}

FieldInfo(filter_type type_, FieldProcessor *proc)
: type(type_)
{
procs.push_back(proc);
}

};

分析:

Parse是调用Parser的方法。

GDB 显示问题(段错误)是在解析器尝试通过遍历 field_info->prefixes 来处理 field_info 时引起的。

编辑:

这是发生段错误的函数的代码(为了调试目的,我添加了一些 cout)。问题出在代码的 while (++piter != prefixes.end()) 部分:

Query get_query() const
{
const list<string> & prefixes = field_info->prefixes;

if (prefixes.empty()) {
assert(!field_info->procs.empty());
return (**field_info->procs.begin())(name);
}
list<string>::const_iterator piter = prefixes.begin();
Query q(make_term(*piter), 1, pos);
while (++piter != prefixes.end()) {
string check3 = make_term(*piter);
Query q2(check3, 1, pos);
q = Query(Query::OP_OR, q, q2);
}
return q;
}

注意:

我正在处理其他人的工作代码。

我已经添加了代码的 if(flag_1) 部分,剩下的一切都已经存在了。

最佳答案

这部分看起来很可疑:

const FieldInfo pos_prefix(NON_BOOLEAN, pos);
const FieldInfo * field_info = &pos_prefix;
Term * term_obj = new Term(&state, term_lowercase, field_info,
term, stem_term, term_pos++);

您正在使用局部变量 pos_prefix 的地址来初始化 term_obj。您必须绝对确保在 pos_prefix 超出范围后永远不会访问该地址,因为那样该地址将无效。

您的代码中有大量原始指针。这在现代 C++ 中不是好的做法。考虑使用普通对象、引用或智能指针。

关于c++ - 需要帮助解决 C++ 中的 Scanner/Lexer 代码部分中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11965998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com