需要帮助调整动态数组的大小 - 检测到堆损坏

问题描述

我正在为我的 C++ 类做一项作业,但在处理需要调整动态数组大小的类的一部分时遇到了问题。对于此作业,我需要将多项式的项存储在动态数组中。我的代码的 setCoefficient 函数特别有问题,如果我试图将多项式的项设为大于数组当前可容纳的项,则需要调整动态数组的大小。

我尝试关注其他一些关于如何调整动态数组大小的堆栈溢出帖子,但一直遇到错误。目前,当我尝试删除 setCoefficient 函数中的旧动态数组时,我遇到了 HEAP CORRUPTION DETECTED 错误

我已经评论了 setCoefficient 函数,并希望有人可以通过并帮助我确定我哪里出错了。不幸的是,我不允许在此作业中使用 STL 向量类。

这是我的 .cpp 文件,您可以在其中看到我遇到问题的 setCoefficient 函数的实现:

#include "poly.h"

//Default constructor. Initializes a poly to: 0x^0
poly::poly()
{
    cout << "No parameter constructor called" << endl;
    polyArray = new int[1];
    //polyArray[1] = 0;
    polyArray[0] = 0;
    length = 0;
}

//Constructor with one argument. Initialized to: coefficientx^0
poly::poly(int coefficient)
{
    cout << "One parameter constructor called" << endl;
    cout << "coefficient: " << coefficient << endl;
    polyArray = new int[1];
    //polyArray[1] = 0;
    polyArray[0] = coefficient;
    length = 0;
}

//Constructor with two arguments. Initialized to: coefficientx^power
poly::poly(int coefficient,int power)
{
    cout << "Two parameter constructor called" << endl;
    cout << "power: " << power << endl;
    cout << "coeff: " << coefficient << endl;
    polyArray = new int[power]; //I think I need to add 1 here to account for that fact that arrays start at index 0.
    
    for (int i = 0; i < power; i++) { //I want to initialize the dynamic array to all 0's
        polyArray[i] = 0;
    }

    polyArray[power] = coefficient;
    length = power;
}

//Destructor
poly::~poly()
{
    cout << "I am the destructor" << endl;
    polyArray = NULL;
    delete [] polyArray;
}

//copy constructor. Creates a deep copy of a poly.
poly::poly(const poly& p)
{
    cout << "copy constructor" << endl;
    this->length = p.length;
    cout << "this->length: " << this->length << endl;
    cout << "p.length: " << p.length << endl;

    this->polyArray = new int[this->length];

    //Loop throguh the initial poly and assign all values in the array to the new poly.
    for (int i = 0; i<=p.length; i++) {
        this->polyArray[i] = p.polyArray[i];
        cout << "this polyArray: " << this->polyArray[i] << endl;
        cout << "p.polyArray: " << p.polyArray[i] << endl;
    }
}

void poly::setCoefficient(const int coefficient,const int power) {
    if (power > this->length) {
        //we need to resize the array we currently have.

        //Here I am creating a new array that will temporarily store larger values
        int* resizedArray = new int[power * 2];

        //This for loop assigns all the values in the current object's array to the new array (resizedArray)
        for (int i = 0; i < this->length; i++) {
            resizedArray[i] = this->polyArray[i];
        }

        //Here I am adding the term that we wanted to add in the first place with setCoefficient
        resizedArray[power] = coefficient;

        //Deleting the terms in polyArray
        delete [] this->polyArray;
        
        //Creating a new array that has been resized
        this->polyArray = new int[power * 2];
        
        //Setting the values of the temporary array,resizedArray,to the array of the current object.
        this->polyArray = resizedArray;
        
        //modifying the length of the current object.
        this->length = power * 2;
    }
    else {
        this->polyArray[power] = coefficient;
    }
}

为了完整起见,这里也是我的 .h 文件(虽然我认为问题不在我的 .h 中:

// ------------------------------------------------ poly.h ----------------------------------------------
#ifndef poly_H                                  
#define poly_H
#include <iostream>
#include <string>

using namespace std;

class poly {
    friend ostream& operator<<(ostream& out,const poly& p);
    friend istream& operator>>(istream& in,poly& p);

public:
    //Member functions
    poly(); //Default constructor. Initializes a poly to: 0x^0
    poly(int coefficient); //Constructor with one argument. Initialized to: coefficientx^0
    poly(int coefficient,int power); //Constructor with two arguments. Initialized to: coefficientx^power
    poly(const poly& p); //copy constructor. Creates a deep copy of a poly.
    ~poly(); //Destructor


    int degree() const; //Returns the largest degree term in a poly.
    double getCoefficient(const int power) const; //returns the coefficient of the x^power term.
    //poly setCoefficient(const int coefficient,const int power); //Sets the coefficient of the term indicated by the power.
    void setCoefficient(const int coefficient,const int power);


    // Arithmetic operators
    poly operator+(const poly& p) const;
    poly operator-(const poly& p) const;

    // Boolean comparison operators
    bool operator==(const poly& p) const;
    bool operator!=(const poly& p) const;

    // Assignment operators
    poly& operator=(const poly& p);

    poly& operator+=(const poly& p);
    poly& operator-=(const poly& p);
    poly& operator*=(const poly& p);

    //Clean up/delete all poly terms.
    void clear();
    //Checks if the poly is empty or not.
    bool isEmpty() const;

private:
    int length; //# of terms in the poly/size of the array
    int* polyArray;
};

#endif

解决方法

这里有一个错误(为简洁起见删除了 cout 条语句):

this->length = p.length;
this->polyArray = new int[this->length];
for (int i = 0; i<=p.length; i++) {
    this->polyArray[i] = p.polyArray[i];
}

for 循环中的测试应该是 i<p.length 而不是 i<=p.length。否则,您将在 polyArray 结尾之后写入一个值,这会调用未定义的行为(这可能导致并经常导致崩溃)