C++ rezing 动态数组最多可以处理一定数量的元素,但在某些时候会崩溃并显示错误 (0XC0000005)



对不起,如果之前已经回答过这个问题。我搜索了调整动态数组的大小,所有的建议似乎都是使用 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

调整大小逻辑中有错误。一切都很好,直到你到达这里。

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

您分配一个新数组,然后立即p指向 temp 指向的数据。然后删除temp指向的数据,这与p相同,这意味着p指向释放的内存;它是一个悬而未决的引用,未定义通过p访问任何内容

但是,修复起来很简单:删除分配和删除,您只需要带有分配的行:

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

你不需要新的空间来ptemp已经得到了它。就把它交给p.然后你不删除temp,因为p在管理它。

相关内容

  • 没有找到相关文章

最新更新