C ++ изменяющий динамический массив работает до определенного количества элементов, но в какой-то момент вылетает с ошибкой (0XC0000005) - PullRequest
0 голосов
/ 29 апреля 2018

Извините, если на этот вопрос уже был дан ответ. Я искал изменение размера динамических массивов, и все советы, похоже, использовать STL Vector, но я делаю задание, в котором смысл сделать свой собственный, минимальный, векторный шаблон класса.

Мой векторный класс должен хранить динамический массив структур, созданных при чтении из входного файла. Одна из вещей, которую он должен сделать, - изменить размер, когда он заполнен. Он работает до определенного момента - обрабатывает 5121 строку из 52207 строк, а затем завершает работу с ошибкой «Процесс возвратил -1073741819 (0XC0000005)».

Я осмотрелся и обнаружил, что это ошибка выделения памяти. Я очень плохо знаком с программированием и C ++, и я озадачен тем, что в моей программе вызывает это. Я предполагаю, что это в моем изменении размера кода массива. Любая помощь будет принята с благодарностью!

Код моего векторного шаблона:

#ifndef VECTOR_H
#define VECTOR_H

#include <iostream>

using namespace std;

template <class T>
class Vector {
public:
  /// Constructor
  Vector();
  /// Copy constructor
  Vector(const Vector<T>& otherVector);
  /// Destructor
  virtual ~Vector();
  /// assignment operator
  const Vector<T>& operator= (const Vector<T>&);
  /// methods
  void addElement(const T& newElement);
  T getElement(int index) const;
  int getLength() const;

protected:
  int arraySize;
  int length;
  T *p;

};

template <class T>
Vector<T>::Vector()
{
  arraySize = 10;
  length = 0;

  p = new T[arraySize];
}

template <class T>
Vector<T>::Vector(const Vector& otherObject)
{
  arraySize = otherObject.arraySize;
  length = otherObject.length;

  p = new T[arraySize];

  for(int i = 0; i < length; i++)
    p[i] = otherObject.p[i];
}

template <class T>
Vector<T>::~Vector()
{
  delete [] p;
}

template <class T>
const Vector<T>& Vector<T>::operator= (const Vector<T>& newVector)
{
  if(this != &newVector)
  {
    delete [] p;
    arraySize = newVector.arraySize;
    length = newVector.length;

    p = new T[arraySize];

    for(int i = 0; i < length; i++)
        p[i] = newVector.p[i];
  }
  return *this;
}

template <class T>
void Vector<T>::addElement(const T& newElement)
{
    if(length == arraySize)
    {
       // create a new resized array
      T *temp;
      temp = new T[arraySize*2];

        // copy elements of p into temp
      for(int i = 0; i < length; i++)
      {
        temp[i] = p[i];
      }

        // delete p and create new p and set equal to temp
      delete [] p;
      arraySize *= 2; // set array size to double
      p = new T[arraySize];
      p = temp;

        // delete temp array
      delete [] temp;

        // add new element and incerement length;
      p[length] = newElement;
      length++;

    }
    else
    {
      p[length] = newElement;
      length++;
    }
}

template <class T>
T Vector<T>::getElement(int index) const
{
  return p[index];
}

template <class T>
int Vector<T>::getLength() const
{
  return length;
}

#endif

1 Ответ

0 голосов
/ 29 апреля 2018

В вашей логике изменения размера есть ошибка. Все хорошо, пока вы не доберетесь сюда.

p = new T[arraySize];
p = temp;

delete [] temp;

Вы выделяете новый массив, а затем сразу указываете p на данные, на которые указывает temp. И затем вы удаляете данные, обозначенные temp, что совпадает с p, что означает p указывает на освобожденную память; это свисающая ссылка, и она не определена для доступа к чему-либо через p

Однако это легко исправить: удалите выделение и удаление, вам нужна только строка с присвоением:

  // p = new T[arraySize];
  p = temp;
  // delete [] temp;

Вам не нужно новое место для p, temp уже получил его. Просто дайте это p. И тогда вы не удаляете temp, потому что p управляет им.

...