尝试访问存储在向量中的数据时出现分段错误

时间:2016-04-15 14:23:58

标签: c++ segmentation-fault

我正在努力学习c ++。我创建了一个矢量类vec,我正在尝试实现一种计算点积的方法。

它编译得很好但运行时出现分段错误。我已将dot产品方法中的x(i)引用固定为原因,但我不知道为什么。我收集它是关于错误地访问内存的东西,但我不知道我做错了什么,也不知道正确的方式。

我的矢量类:

class vec{

    private:
    vector<double> data;
    int n; // size

    public:
    vec (int s) { n = s; data.reserve(n); }

    double get(int i) { return data[i]; }
    void set(int i, double val) { data[i] = val; }
    int size() { return n; }

    double operator[] (int i) { return get(i); }
    double operator() (int i) { return get(i); }

    double dot (vec x) {
        assert(n == x.size());
        int z = 0;
        for (int i = 0; i < n; i++){
            z += data[i] * x(i);
        }

        return z;
    }

};

我试图像这样使用它:

int main(int argc, char *argv[]) {

    vec x = vec(3);
    x.set(0, 1);
    x.set(1, 1);
    x.set(2, 2);

    vec y = vec(3);
    y.set(0, 2);
    y.set(1, 2);
    y.set(2, 3);

    double z = x.dot(y);

}

2 个答案:

答案 0 :(得分:3)

改变这个:

data.reserve(n);

对此:

data.resize(n);

reserve不会在向量中创建项目。它所做的就是增加容量。要预先实际创建n个对象,请使用resize

另外在旁注中,我强烈建议您使用n之类的无关变量来跟踪矢量的大小。请改用vector::size()功能。原因是如果由于某种原因导致n未正确更新,则会冒错误。

因此,这应该是你的构造函数:

vec (int s) : data(s) {}

并转储n成员变量。

答案 1 :(得分:-2)

在本节中:

vec y = vec(3);
y.set(0, 2);
y.set(1, 2);
y.set(2, 3);

您正在设置索引3,这超出了此向量的范围。要解决此问题,请将vec初始化为长度4,或将索引初始化为其他位置。 :)

你也应该调整大小而不是保留,但是这样做不应该导致段错误。它应该让人迷惑。