Добавление двух объектов массива с перегрузкой оператора, приводящей к ошибке сегментации - PullRequest
2 голосов
/ 10 апреля 2019

Я устанавливаю класс в c ++, который будет иметь объекты массива и функцию для их добавления (путем добавления их отдельных компонентов).Каждый из этих объектов имеет указатель на «новый» массив чисел с плавающей точкой, которые будут добавлены вместе.Я считаю, что либо из-за того, что это указатели, либо они назначены «новым» массивам, при обращении к их компонентам через оператор overloaded + возникает какая-то проблема с памятью, но я не уверен, в чем конкретно заключается проблема.Файл компилируется без каких-либо проблем, но просто говорит "Ошибка сегментации (ядро сброшено)" при запуске.Также я знаю, что в цикле for следует использовать минимальное значение, а не максимальное, но сейчас все мои массивы имеют одинаковый размер, поэтому я просто проверяю его следующим образом.

Если я закомментируюПри фактическом добавлении массивов в main () сообщение об ошибке полностью исчезает, но я не совсем уверен, почему.

#include  <iostream>

using namespace std;

class Array
{

private:
   int size, location;
   float value;

public:
   float *arrayptr;

Array(int size)
{
   arrayptr = new float[size];
}

void setValue(int location, float value)
{
   arrayptr[location] = value;
}

Array operator+(Array a)
{
   int max;

   if (a.size >= size)
   {
      max = a.size;
   }
   else
   {
      max = size;
   }

   Array tmparray(max);

   for(int i=0; i<max; i++)
   {
      tmparray.arrayptr[i] = a.arrayptr[i] + arrayptr[i];
   }
   return tmparray;
}

};

main()
{
   Array a1(3);
   a1.setValue(0, 1.0);
   a1.setValue(1, 22.0);
   a1.setValue(2, 12.2);

   Array a2(3);
   a2.setValue(0, 3.3);
   a2.setValue(1, 44.5);
   a2.setValue(2, 21.7);

   Array tmp(3);
   // Source of the error (parenthesis doesn't seem to affect it):
   tmp = (a1 + a2);

}

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Вы не устанавливаете размер в конструкторе, поэтому, когда происходит if (a.size >= size), вы получаете неопределенное поведение.Вероятно, устанавливается какое-то смехотворное значение, и вы уходите от массива.

m_size = size Установите значение размера элемента равным значению размера, переданному в конструктор.

Оператор + также не следит за выходом из массива, когда массивы не совпадаютразмер.

1 голос
/ 10 апреля 2019

Вы не инициализировали переменную размера.

Вам нужно его инициализировать.

Array(int _size)
{
    size = _size;
    arrayptr = new float[size];
}

А ваша переменная размера - приватная.

Так что это не может ссылаться. Поэтому переменную размера нужно объявить как общедоступную.

...