Я использую «динамическое выделение памяти», чтобы создать массив для домашнего задания, в котором нам не разрешено использовать массивы или векторы C ++ по умолчанию.
В методе изменения размера я создаю новый массив снужного размера, скопируйте данные из более старого массива, затем попытайтесь удалить coeffPtr, а затем переназначьте его.
Visual Studio выдает исключение в строке удаления, но не сообщает мне, что это за исключение.
В чем проблема с этим кодом?
РЕДАКТИРОВАТЬ: Я обновил это, чтобы включить минимальный .h, .cpp и драйвер, чтобы проиллюстрировать проблему.Также, чтобы уточнить, у меня в настоящее время в CSS343 (по существу, часть 2 C ++) был ужасный учитель для 342 (часть 1), так что нет, я не припоминаю, чтобы меня когда-либо учили правилу 3. При этом я быстро реализовал деструктор ипредоставил перегрузчик назначения, даже если он не используется.
poly.h
#ifndef POLYSMALL_H
#define POLYSMALL_H
class Poly {
public:
// Constructor
Poly(int coefficient, int exponent);
// Destructor
~Poly();
// Setter
void setCoeff(int, int);
// Array Functions
void resize(int);
void copy(const Poly&);
// Assignment operators
const Poly &operator=(const Poly&);
private:
// Allocated Memory
int* coeffPtr = nullptr;
int size;
};
#endif // POLYSMALL_H
poly.cpp
#include "polysmall.h"
// Constructor with two inputs
Poly::Poly(int coefficient, int exponent) {
// Initialize the polynomial array with the length of the exponent
// +1 because arrays starting at 0 rather than one
coeffPtr = new int[exponent];
size = exponent;
for (int i = 0; i < size; i++) {
coeffPtr[i] = 0;
}
coeffPtr[exponent] = coefficient;
}
// Destructor
Poly::~Poly() {
delete[] coeffPtr;
}
// Setter
void Poly::setCoeff(int coefficient, int exponent) {
// Check to see if exponent is greater than array index
if (exponent > size) {
resize(exponent);
}
coeffPtr[exponent] = coefficient;
}
// Resize
void Poly::resize(int newSize) {
// Create new array
int* newCoeffPtr = new int[newSize];
// Create int values for the array
for (int i = 0; i < newSize; i++) {
newCoeffPtr[i] = 0;
}
// Copy over data
for (int i = 0; i < size && i < newSize; i++) {
newCoeffPtr[i] = coeffPtr[i];
}
// Update size
size = newSize;
// Delete old array
delete[] coeffPtr;
// Assign new array
coeffPtr = newCoeffPtr;
}
void Poly::copy(const Poly& polynomial) {
// Adjust size of array if needed
if (size < polynomial.size) {
resize(polynomial.size);
}
// Copy over data
for (int i = 0; i < size; i++) {
coeffPtr[i] = polynomial.coeffPtr[i];
}
}
const Poly &Poly::operator=(const Poly &polynomial) {
// Resize our array to match new poly's array
if (polynomial.size != size) {
resize(polynomial.size);
}
// Copy over data
for (int i = 0; i < size; i++) {
coeffPtr[i] = polynomial.coeffPtr[i];
}
// Return this
return *this;
}
driver.cpp
#include "polysmall.h"
#include <iostream>
using namespace std;
int main() {
// Create polynomial of 2x^4 or of an array of [0,0,0,2]
Poly polynomial(2,4);
// Attempt to set index of 5 to 3
// Invokes resize to adjust array to [0,0,0,2,0]
polynomial.setCoeff(3, 5);
return 0;
}