2014-12-23 6 views
0
Class vector 
{ 
    int *v ; 
    int size; 
    public: 

    vector(int m) // create a null vector 
    { 
     v=new int[size = m]; 
     for(int i=0;i<size;i++) 
      v[i]=0; 
    } 

    vector(int *a) //create a vector from an array 
    { 
     for(int i=0;i<size;i++) 
      v[i]=a[i]; 
    } 

    int operator*(vector &y) //scalar product 
    { 
     int sum=0; 
     for(int i=0;i<size;i++) 
      sum+=this->v[i]*y-v[i]; 
     return sum; 
    } 
}; 


int main() 
{ 
    int x[3]={1,2,3}; 
    int y[3]={4,5,6}; 
    vector v1(3); //create a null vector of 3 integers 
    vector v2(3); 
    v1=x; //create v1 from the array x 
    v2=y; 

    int R=v1*v2; 
    cout<<”R=”r; 
    return 0; 
} 

После выполнения выше программ я получаю ошибку сегментации в этой точке («v1 = х»;) Может ли один пожалуйста, объясните, почему я получаю ошибку сегментации.ошибки сегментации при инициализации объекта

+3

'v1 = x; // создаем v1 из массива x', вы не создаете 'v1', вы присваиваете ему значение. – nouney

+1

В коде есть как минимум 2 опечатки. Пожалуйста, всегда скопируйте-вставьте код, который воспроизводит проблему, а не вводит ее в поле зрения. – user2079303

+0

Мне любопытно, есть ли причина не использовать контейнеры стандартной библиотеки? Или просто ты о них не знаешь? Все, что вы получите с помощью такого кода, - это ваше время: современный C++ обескураживает использование необработанных указателей и обработку памяти (кроме того, не изобретая колесо). – kebs

ответ

2

Когда вы строите свой vector от int*, вы не устанавливаете size, но получаете доступ к его значению. Этот конструктор используется для неявного преобразования от int* до vector, необходимого для назначения. Доступ к неинициализированному значению приводит к тому, что программа имеет неопределенное поведение. Скорее всего, size имеет некоторый результат для эффективного доступа в недоступную для доступа память.

Тот факт, что вы поставили левую сторону задания на определенный размер, не помогает. Это может помочь, если вы определили свое собственное задание от int* к vector:

vector& vector= (int* other) { 
    // ... 
} 

Имея это оператор присваивания (с подходящей реализацией, конечно) позволит избежать неявное преобразования из int* в vector и вы могли бы использовать size с левой стороны.

Это далеко не единственная программа с кодом:

  • Вы выделяете память, но вы никогда не выпустить его. Если вы выделяете память в конструкторе, вам понадобится деструктор для освобождения памяти.
  • Конечно, как только вы это сделаете, вы легко разблокируете память несколько раз, потому что у вас нет конструктора копирования или назначения копии, а сгенерированные версии компилятора выполняют плоскую копию.
0

Проблема заключается в том, как распределяется ваша память. Давайте смотреть только на эти четыре строки:

vector v1(3); //create a null vector of 3 integers 
v1=x; //create v1 from the array x 

В первой строке создается новый объект v1 создается с использованием вектора (INT м) форма конструктора. Здесь в куче выделяется новый массив int.

В третьей строке создается новый объект, заменяющий тот, который назначен в строке 1. И здесь возникают проблемы, так как в этой строке используется конструктор vector (int * a), который не выделяет массив v, и не делает он задает переменную размера. Таким образом, вы копируете ввод на не выделенный адрес, который вызывает ошибку стека. Кроме того, вы никогда не освобождаете память, выделенную в конструкторе первой строки.

Другие проблемы с вашим кодом: В * -оператором вы Умножая Int с вектором

sum += this->v[i] * y - v[i]; 
        ^^^ 

хотя этот оператор умножения не определен.

Эта линия будет также не компилируется:

cout<<”R=”r; 

Во-первых, из-за пропавшего < < между «R =» и г, а затем из-за странного».

Смежные вопросы