Исключение выдается при удалении [] при удалении int * - PullRequest
0 голосов
/ 19 января 2019

Я использую «динамическое выделение памяти», чтобы создать массив для домашнего задания, в котором нам не разрешено использовать массивы или векторы 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;
}
...