Я пытаюсь изучить C++. Я создал векторный класс vec
, и я пытаюсь реализовать метод вычисления продукта dot.Ошибка сегментации при попытке доступа к данным, хранящимся в векторе
Он компилируется нормально, но при его запуске возникает ошибка сегментации. Я приколол ссылку x (i) в методе продукта dot
в качестве причины, но я понятия не имею, почему. Я понимаю, что это некоторая проблема с неправильным доступом к памяти, но я понятия не имею, что я делаю неправильно и каков будет правильный путь.
Мой векторный класс:
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);
}
Это было быстро. Благодарю. –
Я удивлен тем, что это превзошло все это. Память готова к использованию, и здесь нет возможности попытаться прочитать представление ловушки из неинициализированной ценности или что-то в этом роде. Это какая-то темная магия. Возможно, оптимизация задерживает (или полностью ускоряет) выделение, поскольку компилятор видит, что вы никогда не создаете никаких элементов, поэтому зарезервированная память «не нужна». –
I _know_ это разрешено; Я говорю, что я удивлен, что это _did_. –