为啥这个看似简单的 C++ 代码会产生分段错误?

Posted

技术标签:

【中文标题】为啥这个看似简单的 C++ 代码会产生分段错误?【英文标题】:Why does this seemingly simple C++ code generate a segmentation fault?为什么这个看似简单的 C++ 代码会产生分段错误? 【发布时间】:2015-06-26 02:58:59 【问题描述】:

我正在尝试编写增强算法(人工智能的一项功能)。速度是重中之重,所以我已经从使用本机 Python 切换到 C++。我写出了整个程序,但我发现了一个错误,我将其缩减为我在基类中犯的一个错误:一个非常简单的启发式方法,称为“H”。文件 h.h、h.cpp 和我当前的测试函数 main.cpp 是:

//h.h

#ifndef __H_H_INCLUDED__
#define __H_H_INCLUDED__

#include <iostream>
#include <vector>

class H

    public:
        H(int, double, bool);
        //The first parameter is the axis
        //The second parameter is the cutoff
        //The third parameter is the direction
        bool evaluate(std::vector<double>&);
        //This evaluates the heuristic at a given point.
    private:
        int axis;
        double cutoff;
        bool direction;
;

#endif

//h.cpp

#include "h.h"

H::H(int ax, double cut, bool d)

    axis = ax;
    cutoff = cut;
    direction = d;


bool H::evaluate(std::vector<double>& point)

    if (direction)
    
        return point[axis] > cutoff;
    
    else
    
        return point[axis] <= cutoff;
    


//main.cpp

#include <iostream>
#include <vector>
#include "h.h"

int main()

    H h(0, 2.0, true);
    for (double x = 0; x < 4; x = x + 1)
    
        for (double y = 0; y < 4; y = y + 1)
        
            std::vector<double> point(x, y);
            std::vector<double>& point_ref = point;
            std::cout << "Before computation" << std::endl;
            bool value = h.evaluate(point_ref);
            std::cout << "After computation" << std::endl;
            std::cout << "heuristic(x = " << x << ", y = " << y << ") = " << value << std::endl;
        
    
    return 0;

(我将“计算前”和“计算后”放入以确定错误发生在哪一行。)与我期望的输出完全相反,我得到:

 Before computation
 Segmentation fault (core dumped)

我做错了什么?该错误消息甚至意味着什么? 谢谢!

编辑:我正在使用 C++11,仅供那些好奇的人使用。

【问题讨论】:

您的矢量point 为空。将 x 和 y 推回它。 【参考方案1】:

这一行:

std::vector<double> point(x, y);

使用xy 副本创建vector。这是constructor #2 here。因此,当 x 为 0 时,point 为空 vector - 这意味着您对索引 0 处的元素的访问是未定义的行为,在这种情况下表现为分段错误。

您可能打算做一个包含xy 两个值的向量,即:

std::vector<double> pointx, y; // in c++11, note the braces

std::vector<double> point(2);    // pre-c++11
point[0] = x;
point[1] = y;

【讨论】:

谢谢!完美运行

以上是关于为啥这个看似简单的 C++ 代码会产生分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥大型静态数组会产生段错误而动态却不会? (C++)

为啥这个非常简单的构造函数会导致段错误?

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

为啥重新声明 std::cout 会导致分段错误?

为啥使用 gdb 启动 C++ 程序时出现分段错误?

为啥存储此向量时会出现分段错误?