c++ - Dynamic Memory Allocation - All objects are the same -


i'm writing c++ program reads in list of passengers , creates passenger objects stored in dynamically allocated pointer. however, noticed when ran program, adding new passenger cause of set passengers assigned new passenger too.

the problematic segment of code below:

int x = 400; passengerslot = 0; passenger * list = new passenger[x]; ifstream myfile("airline.csv"); if (myfile.is_open()) {     while (getline(myfile, line))     {         std::istringstream ss(line);         std::string token;         int dataslot = 0;         while (std::getline(ss, token, ',')) {             switch (dataslot){             case 0:                 *last = token;                 break;             case 1:                 *first = token;                 break;             case 2:                 *rownum = atoi(token.c_str());                 break;             case 3:                 *seat = token.at(0);                 break;             case 4:                 *flightnum = atoi(token.c_str());                 list[passengerslot] = *new passenger(last, first, rownum, flightnum, seat);                 cout << list[passengerslot].getpassenger() << endl; //prints passengers assigned                 if (passengerslot != 0){                     cout << list[passengerslot - 1].getpassenger() << endl;                 } 

my passenger constructor:

passenger::passenger(string *fname, string *lname, int *rownum, int *flightnum, char *seatchar):firstname(fname), lastname(lname), rownumber(rownum), flightnumber(flightnum), seat(seatchar){ *firstname = *fname; *lastname = *lname; *rownumber = *rownum; *flightnumber = *flightnum; *seat = *seatchar; } 

the unusual dereferencing of pretty has me worried may reusing same pointers on , over, writing on same memory locations every time, assigning memory locations pointers inside passenger.

for example, constructor:

passenger::passenger(string *fname, string *lname, int *rownum, int *flightnum, char *seatchar):firstname(fname), lastname(lname), rownumber(rownum), flightnumber(flightnum), seat(seatchar) {     *firstname = *fname;     *lastname = *lname;     *rownumber = *rownum;     *flightnumber = *flightnum;     *seat = *seatchar; } 

firstname(fname) means has pointer string, if program compiles, firstname being assigned address pointed fname. same pattern follows other members , associated parameter.

*firstname = *fname; nothing. copies string @ fname on top of string @ firstname, because of assignment in previous point exact same place.

this means of passenger::firstnames point fname, passenger::lastnames point lname, etc... end result passengers same recent passenger.

solution: stop using pointers everything. don't need pointers.

the accumulation variables should be:

std::string first; std::string last;  int rownum; int flightnum; char seat; 

passenger should be:

class passenger { public:     passenger(const std::string & fname,                const std::string & lname,                int rownum,                int flightnum,               char seatchar);     // other unspecified public methods private:     std::string firstname;      std::string lastname;     int rownumber;     int flightnumber;     char seat;     // other unspecified private data , methods } 

and constructor

passenger::passenger(const std::string & fname,                       const std::string & lname,                       int rownum,                       int flightnum,                      char seatchar):     firstname(fname), lastname(lname), rownumber(rownum),      flightnumber(flightnum), seat(seatchar) { } 

storage definition of

passenger * list = new passenger[x]; 

should more along lines of

std::vector<passenger> list; 

std::vector dynamically sizing array of memory management required use cases built right in.

and rather loading list with

list[passengerslot] = *new passenger(last, first, rownum, flightnum, seat); 

use

list.emplace_back(first, last, rownum, flightnum, seat); 

Comments