Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要帮助解决C+中扫描器/词法器代码部分的分段错误+;_C++_Segmentation Fault - Fatal编程技术网

C++ 需要帮助解决C+中扫描器/词法器代码部分的分段错误+;

C++ 需要帮助解决C+中扫描器/词法器代码部分的分段错误+;,c++,segmentation-fault,C++,Segmentation Fault,分段错误是由扫描仪代码引起的 问题是: 使用GDB回溯显示问题是由名为field\u info(其中FieldInfo是一个struct)的FieldInfo指针在以下条件下的声明引起的:if(tell\u me) 请注意,下面的代码是一个大文件的一部分,因此,如果有些东西的声明不在这里,您可能会假设它们已经在程序的其他地方定义了,而没有显示在这里 示例代码: }) 分析: Parse是一个调用解析器的方法 GDB揭示了问题(分段错误)是由解析器试图通过迭代字段信息->前缀来处理字段信息时引起的

分段错误是由扫描仪代码引起的

问题是: 使用GDB回溯显示问题是由名为
field\u info
(其中
FieldInfo
是一个
struct
)的
FieldInfo
指针在以下条件下的声明引起的:if(
tell\u me

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

示例代码: })

分析: Parse是一个调用解析器的方法

GDB揭示了问题(分段错误)是由解析器试图通过迭代
字段信息->前缀来处理
字段信息
时引起的

编辑: 下面是发生分段错误的函数的代码(为了调试,我添加了一些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;
}
Query get\u Query()常量
{
常量列表和前缀=字段信息->前缀;
if(前缀为.empty()){
断言(!field_info->procs.empty());
返回(**字段信息->过程开始())(名称);
}
list::const_iterator piter=前缀。begin();
查询q(生成术语(*piter),1,位置);
while(++piter!=前缀.end()){
字符串检查3=生成术语(*piter);
查询q2(检查3、1、pos);
q=查询(查询::OP_或,q,q2);
}
返回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\u prefix
初始化
term\u obj
。您必须绝对确保在
pos\u prefix
超出范围后,不会访问此地址,因为这样地址将无效


您的代码中有大量的原始指针。这不是现代C++中的好实践。考虑使用纯对象、引用或智能指针。

也许应该显示出现分段错误的实际代码?换句话说,你在哪里进行迭代。你的代码非常混乱。。。函数中真的有两个构造函数吗?@JoachimPileborg:添加了那部分代码。@JoachimPileborg:没有,那是错误的。(当我粘贴那部分代码时,堆栈溢出格式出现了一些问题)。对此深表歉意。我已经编辑了那部分代码。在
else
部分也没有太好。OP从堆栈中获取指针,可能是指向局部变量的指针。正如您所提到的,代码中有很多气味-我选择了一个具有代表性的摘录:)
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;
}
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++);