问题描述
我正在为我的 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
结尾之后写入一个值,这会调用未定义的行为(这可能导致并经常导致崩溃)