C++ 向量和分段错误

Posted

技术标签:

【中文标题】C++ 向量和分段错误【英文标题】:C++ vector and segmentation faults 【发布时间】:2012-04-08 05:26:36 【问题描述】:

我正在开发一个简单的数学解析器。只是写着number = 1 + 2;

我有一个包含这些标记的向量。它们存储字符的类型和字符串值。我正在尝试逐步通过向量来构建这些标记的 AST,并且我不断遇到分段错误,即使我认为我的代码应该防止这种情况发生。

这是构建 AST 的代码:

struct ASTGen

    const vector<Token>            &Tokens;
    unsigned int                   size,
                                   pointer;

    ASTGen(const vector<Token> &t) : Tokens(t), pointer(0) 
    
        size = Tokens.size() - 1;
    

    unsigned int next()
    
        return pointer + 1;
    

    Node* Statement()
    
        if(next() <= size)
        
            switch(Tokens[next()].type)
            
                case EQUALS
                :
                    Node* n = Assignment_Expr();
                    return n;
            
        

        advance();
    

    void advance()
    
        if(next() <= size) ++pointer;
    

    Node* Assignment_Expr()
    
        Node* lnode = new Node(Tokens[pointer], NULL, NULL);
        advance();
        Node* n = new Node(Tokens[pointer], lnode, Expression());
        return n;
    

    Node* Expression()
    
        if(next() <= size)
                                
            advance();
            if(Tokens[next()].type == SEMICOLON)
            
                Node* n = new Node(Tokens[pointer], NULL, NULL);
                return n;
            

            if(Tokens[next()].type == PLUS)
            
                Node* lnode = new Node(Tokens[pointer], NULL, NULL);
                advance();
                Node* n = new Node(Tokens[pointer], lnode, Expression());
                return n;
            
        
    
;

...

ASTGen AST(Tokens);
Node* Tree = AST.Statement();
cout << Tree->Right->Data.svalue << endl;

我可以访问Tree-&gt;Data.svalue 并获取= 节点的令牌信息,因此我知道该节点正在生成,我还可以获取Tree-&gt;Left-&gt;Data.svalue 并获取= 左侧的变量

我已经重写了很多次尝试不同的方法来遍历向量,但是当我尝试访问 = 右节点(应该是 + 节点)时,我总是遇到分段错误

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

还有很多我们没有看到的代码,所以我不能准确地告诉你发生了什么,但我看到了一些值得关注的事情。一是 Statement() 方法并不总是返回一个值。如果第一个if 测试没有通过,那么我们调用advance() 并在没有显式返回的情况下从例程的底部跌落。调用者将尝试获取函数的返回值,但它会得到垃圾。这可能会导致各种问题,包括两次free() 调用等,很容易导致段错误。

Expression() 也有同样的问题。

【讨论】:

他的Expression() 函数也有不返回值的代码路径。 我确实意识到了这一点,但现在我并不担心,因为这应该对 number = 1 + 2; 正常工作,或者至少,这是希望。一旦我可以解决这个测试用例,我将完成其他控制路径。 @Headspin:调高编译器的警告级别。你可能在其他地方也有类似的可疑之处。 感谢 Blastfurnace 的建议。我用-Wall 编译并且能够看到错误。谢谢欧内斯特。由于出现了警告级别,我能够看到我在没有返回类型的情况下到达了控制路径的尽头。我会确保以后不再假设这些事情。

以上是关于C++ 向量和分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用向量时出现分段错误

在 C++ 中比较来自向量的字符串时出现分段错误

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

C++:当我添加看似无关的代码行时,分段错误消失了

C++ 向量和分段错误

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]