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

时间:2015-06-26 02:58:59

标签: c++ class reference segmentation-fault

我正在尝试编写一种增强算法(人工智能的一项功能)。速度是一个优先事项,所以我已经从使用我的原生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,只是为了那些好奇的人。

1 个答案:

答案 0 :(得分:6)

这一行:

newValue

制作std::vector<double> point(x, y); vectorx份。这是constructor #2 here。因此,当y为0时,x为空point - 这意味着您对索引0处元素的访问是未定义的行为,在这种情况下由分段错误显示。

您可能打算做的是制作一个包含两个值vectorx的向量,它们将是:

y