如何解决需要帮助调整动态数组的大小 - 检测到堆损坏
我正在为我的 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
结尾之后写入一个值,这会调用未定义的行为(这可能导致并经常导致崩溃)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。