Ошибка сегментации при инициализации объекта

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 = x";) Может кто-нибудь объяснить, почему я получаю ошибку сегментации.

  • 3
    v1=x; //create v1 from the array x вы не создаете v1 , вы присваиваете ему значение.
  • 1
    В коде есть как минимум 2 опечатки. Пожалуйста, всегда копируйте и вставляйте код, который воспроизводит проблему, а не вводите ее в виде.
Показать ещё 3 комментария
Теги:

2 ответа

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 с использованием формы конструктора vector (int m). Здесь в куче выделяется новый массив int.

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

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

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

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

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

cout<<"R="r;

Сначала из-за отсутствия << между "R =" и r, а затем из-за странного ".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню