具有动态内存分配的C ++类 - 为什么我会收到此错误?

时间:2015-02-26 17:41:04

标签: c++ dynamic-memory-allocation

我正在创建一个名为DblArray的类,并为它执行基本功能。但是,在编译时我似乎遇到了问题,因为它说“释放对象的错误校验和 - 对象可能在被释放后被修改”。我将在下面发布我的所有代码,但我认为问题出现在这个函数中:

void DblArray::insertVal(double n)
{
  if ( size == capacity )
  {
    capacity *= 2;
    double temp[size];

    for ( int i = 0; i < size; i++ )
      temp[i] = data[i];
    delete [] data;
    data = 0;

    data = new double[capacity];
    for ( int i = 0; i < size; i++ )
      data[i] = temp[i];
  }
  size++;
  data[size] = n;
}

头文件是这样的:

#include <iostream>

#ifndef DBLARRAY_H
#define DBLARRAY_H

class DblArray
{
private:
  long capacity;
  long size;
  double * data;
public:
  DblArray();
  ~DblArray();
  DblArray(const DblArray& d);
  DblArray& operator = (const DblArray& d);

  double operator [] (int i);
  long getCapacity();
  long getSize();
  double getAverage();
  void insertVal(double);
  void removeVal();
};

#endif // DBLARRAY_H

实施文件是:

#include "DblArray.h"

DblArray::DblArray()
{
  capacity = 1;
  size = 0;
  data = new double[capacity];
}

DblArray::~DblArray()
{
  capacity = 0;
  size = 0;
  delete [] data;
  data = NULL;
}

DblArray::DblArray(const DblArray& d)
{
  capacity = d.capacity;
  size = d.size;
  data = new double[capacity];

  for ( int i = 0; i < size; i++ )
  {
    data[i] = d.data[i];
  }
}

DblArray& DblArray::operator = (const DblArray& d)
{
  DblArray dNew;
  dNew.capacity = d.capacity;
  dNew.size = d.size;
  dNew.data = new double[capacity];

  for ( int i = 0; i < dNew.size; i++ )
  {
    dNew.data[i] = d.data[i];
  }

  return dNew;
}

double DblArray::operator [] (int i)
{
  return data[i];
}

long DblArray::getCapacity()
{
  return capacity;
}

long DblArray::getSize()
{
  return size;
}

double DblArray::getAverage()
{
  double average = 0;
  for ( int i = 0; i < size; i++ )
  {
    average += data[i];
  }
  average = average / size;

  return average;
}

void DblArray::insertVal(double n)
{
  if ( size == capacity )
  {
    capacity *= 2;
    double temp[size];

    for ( int i = 0; i < size; i++ )
      temp[i] = data[i];
    delete [] data;
    data = 0;

    data = new double[capacity];
    for ( int i = 0; i < size; i++ )
      data[i] = temp[i];
  }
  size++;
  data[size] = n;
}

void DblArray::removeVal()
{
  data[size] = 0;
}

司机是这样的:

#include <iostream>
#include "DblArray.h"

using namespace std;

DblArray print( DblArray );

int main()
{
  //Data abstractions
  DblArray d1;

  //Printing the contents of d1 before testing functions
  print(d1);

  for ( int i = 0; i < 5; i++ )
  {
    d1.insertVal(i);
  }

  //Printing contents of d1 after adding values
  print(d1);

  return 0;
}

//Function to print the contents of each object
DblArray print( DblArray d )
{
  cout << "Capacity:\t" << d.getCapacity() << endl;
  cout << "Size:\t" << d.getSize() << endl;
  cout << "Data:\t" << endl;
  for ( int i = 0; i < d.getSize(); i++ )
  {
    cout << d[i] << "\t";
  }
  cout << "\n";
}

3 个答案:

答案 0 :(得分:0)

insertVal()

size++;
data[size] = n;

应改为

data[size++] = n;

否则,当size == capacity-1时,data[size] = n;写出数组边界。同样的问题也发生在removeVal()

你的operator=()的语义也很奇怪。它根本不修改this,并且返回对本地对象的引用是错误的。通常看起来应该是这样的:

DblArray& DblArray::operator=(const DblArray& rhs) {
    if (this == &rhs) return *this;
    delete [] data;
    data = new double[rhs.capacity];
    capacity = rhs.capacity;
    size = rhs.size;
    // copy rhs.data[0] .. rhs.data[size-1] into data[]
    return *this;
}

或定义DblArray::swap()并执行复制和交换习惯用法。

答案 1 :(得分:0)

你有:

  

if(size == capacity)

然后你分配:

  

data = new double [capacity];

因此数据的大小为size。最后你有:

  

大小++;   data [size] = n;

这是在数组边界外写的,是造成未定义行为的原因,可能会导致错误

答案 2 :(得分:0)

你的消息来源中存在很多问题,有两个问题立即出现在我身上:

签名为DblArray print(DblArray)的函数不返回值。您应该更改签名以匹配实际行为,还应考虑将DblArray作为参考传递:void print(const DblArray& d)

我发现的其他问题已被其他答案提出。出于好奇,你使用哪个编译器和平台?考虑不时地将代码粘贴到在线编译器中,如果您在Windows构建环境中运行,gcc和clang往往会很好地发出警告。特别是,我使用Coliru。您可以自定义编译器标志以显示更多或更少警告等。在您的示例中,您应该能够粘贴您在此处编写的所有内容,删除任何#include <DblArray.h>指令,并且可以继续使用。