我正在尝试学习C++。我创建了一个矢量类vec
,我试图实现一种计算点积的方法。尝试访问存储在向量中的数据时出现分段错误
它编译得很好,但运行时出现分段错误。我已经将产品方法中的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);
}
这很快。谢谢。 –
虽然我很惊讶这个segfaulted。内存已经可以使用了,在这里没有机会尝试从未初始化的值或类似的东西读取陷阱表示。这是一些黑暗的魔法。可能的优化会延迟(或完全消除)分配,因为编译器发现您从未实际创建任何元素,因此保留内存“不需要”。 –
我知道它被允许;我说我很惊讶,它_did_。 –