Memory access violation error 0xC0000005: Access violation reading location 0xDDDDDDD9

0

I made a Flight class which holds flightNo, rowNo, seatNo and seating plan of this flight. I am creating the seating plan by using 2d dynamic string array. This array will show seat and row numbers, and also the availablity of the seats by 'o' or 'x'.

For instance if rowNo = 3 and seatNo = 3, seating plan will be:

 A B C 
1o o o
2o o o
3o o o

This is Flight class

#include "Flight.h"
#include <iostream>
using namespace std;

Flight::Flight( int fNo, int rNo, int sNo ) {
    setFlightNo( fNo );
    setRowNo( rNo );
    setSeatNo( sNo );
    setAvailable( rNo * sNo );
    
    //Create 2d dynamic array for seatPlan
    seatPlan = new string * [ rNo + 1 ];
    for (int i = 0; i < rNo + 1; i++) {
        seatPlan[i] = new string[ sNo + 1 ];
    }

    //Initialize seatPlan
    initializeSeatPlan( rNo, sNo );
}

Flight::Flight() {
    setFlightNo(0);
    setRowNo(0);
    setSeatNo(0);
    setAvailable(0);

    seatPlan = new string * [ getRowNo() + 1 ];
    for (int i = 0; i < getRowNo() + 1; i++) {
        seatPlan[i] = new string[ getSeatNo() + 1 ];
    }

    //Since its size is one, just initialize seatPlan[0][0]
    seatPlan[0][0] = " ";
}

Flight::~Flight() {
    for (int k = 0; k < getRowNo() + 1; k++) {
         delete [] seatPlan[k];
     }
     delete[] seatPlan;
}

void Flight::initializeSeatPlan(int rNo, int sNo) {

    const string alphabet[26] = { "A","B","C","D","E","F","G","H","I","J",
                    "K","L","M","N","O","P","Q","R",
                    "S","T","U","V","W","X","Y","Z" };

    seatPlan[0][0] = " ";

    //Initialize first row except seatPlan[0][0]
    for (int i = 1; i < sNo + 1; i++) {
        seatPlan[0][i] = alphabet[i - 1];
    }
     
    //Initialize first indexes of each row except seatPlan[0][0]
    for (int i = 1; i < rNo + 1; i++) {
        seatPlan[i][0] = i + '0';
    }
    
    //Initialize rest of the array with 'o'
    for (int i = 1; i < rNo + 1; i++) {
        for (int j = 1; j < sNo + 1; j++) {
            seatPlan[i][j] = "o";
        }
    }
}

Then I created another class called ReservationSystem which holds a dynamic Flight array. flightAmount is the size of this array. In this class, there is an addFlight function and when I call it, my program crashes. Visual Studio says that there is a memory access violation in my Flight class destructor, but I can't find why. When I comment inside of Flight class' destructor, it works fine, but it leaks memory.

This is my ReservationSystem

#include "ReservationSystem.h"
#include <iostream>
using namespace std;

ReservationSystem::ReservationSystem() {
    flightAmount = 0;
    flights = new Flight[flightAmount];
}

ReservationSystem::~ReservationSystem() {
    delete[] flights;
}

void ReservationSystem::addFlight(const int flightNo, const int rowNo, const int seatNo) {
    if (flightNoExist(flightNo) != -1) {
        cout << "Flight " << flightNo << " already exists" << endl;
    }
    else if (rowNo <= 0) {
        cout << "Invalid Row Number " << rowNo << "!" << endl;
    }
    else if (seatNo <= 0) {
        cout << "Invalid Seat Number!" << seatNo << "!" << endl;
    }
    else {
        //To increase the size of flights array create new tmp array
        Flight* tmp = new Flight[flightAmount + 1];
        
        //Copy from flights to tmp
        for (int i = 0; i < flightAmount; i++) {
            tmp[i] = flights[i];
        }

        //Create the new flight and add it to tmp
        Flight f(flightNo, rowNo, seatNo);
        tmp[flightAmount] = f;
 
        delete[] flights;
        flights = tmp; //Flights now pointing to where tmp is pointing
        flightAmount++;

        cout << "Flight " << flightNo << " has been added" << endl;
    }
}

This is the part where Visual Studio says there is a memory access violation:

Flight::~Flight() {
    for (int k = 0; k < getRowNo() + 1; k++) {
         delete [] seatPlan[k];
     }
     delete[] seatPlan;
}

EDIT:

I overrided the = operator but error still persists.

My = operator

Flight& Flight::operator=( Flight& right ) {
    if (&right != this) {

        flightNo = right.getFlightNo();
        rowNo = right.getRowNo();
        seatNo = right.getSeatNo();
        available = right.getAvailable();

        //Delete old seatPlan
        for (int k = 0; k < rowNo + 1; k++) {
            delete[] seatPlan[k];
        }
        delete[] seatPlan;
        
        //Create new seatPlan with right's dimensions
        seatPlan = new string*[right.getRowNo() + 1];
        for (int i = 0; i < right.getRowNo() + 1; i++) {
            seatPlan[i] = new string[right.getSeatNo() + 1];
        }

        //Copy the content from right
        for (int i = 0; i < right.getRowNo() + 1; i++) {
            for (int k = 0; k < right.getSeatNo(); k++) {
                seatPlan[i][k] = right.seatPlan[i][k];
            }
        }
    }
    return* this;
}

But now Visual Studio says that memory violation occurs inside of my overrided = operator function while deleting seatPlan array. Spesifically it is again this part:

for (int k = 0; k < rowNo + 1; k++) {
    delete[] seatPlan[k];
}
delete[] seatPlan;
c++
asked on Stack Overflow Nov 19, 2020 by firemancer • edited Nov 19, 2020 by firemancer

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0