Bogdan M.
Bogdan M.

Reputation: 2181

Program crash when trying to work on the vector member of a class

Hello i tried everything i could think at to repair the crash... but didn't get anywere. So i'll try to paste the main components of the program so maybe someone can help with this... the program compiles has no errors but it crashes. If i run the program take first option '1' than enter inputs... when it gets to save part it just crashes. Some parts of the code are commented out ebcuase i tried to fnd the soruce of the crash. In case i forgott something or you need soem other details please ask SORRY for the long code. Main function and Appplication Class:

#include "Catalog.h"
#include "UIconsole.h"
#include "StudentRepository.h"
#include "StudentValidator.h"


using namespace std;

class Application{
private:
    StudentRepository *stre;
    StudentValidator *stvl;
    Catalog *cat;
    UIconsole *ui;    
public:
    Application();
    ~Application();
    void run();
};    
int main(){
    Application app;
    app.run();
    return 0;
}    
Application::Application(){
    StudentRepository stre();
    StudentValidator stvl();
    Catalog cat();
    UIconsole ui();
}    
Application::~Application(){
}
void Application::run(){
    ui->runUI();
}

UIconsole.h (were inputs are choisen):

class UIconsole{
public:
    UIconsole(Catalog *catalog):catalog(catalog){};
    void runUI();

private:
    Catalog *catalog;

    void showMenu();
    int getOption();

    void addStudent();

UIconsole.cpp

int inp;
do{
    showMenu();
    inp = getOption();
    switch(inp){
    case 0: break;
    case 1: addStudent();break;
    }while(inp != 0);
}

void UIconsole::addStudent(){
    string name;
    int id,gr;
    cout<<"Name: ";
    cin>>name;
    cout<<"ID: ";
    cin>>id; cout<<endl;
    cout<<"Group: ";
    cin>>gr; cout<<endl;

    catalog->addNewStudent(name,id,gr);
//  try {
//      catalog->addNewStudent(n,id,gr);
//      cout<<"Student has been added!"<<endl;
//  } catch (Exception &ex) {
//      cout<<"Student HASN'T been added"<<ex.getMsg()<<endl;
//  }

}

catalog.cpp:

void Catalog::addNewStudent(string name, int id, int gr){
Student st(name, id,gr);
//StudentValidator.
studRepo.save(st);

}

studentRepo.cpp:

void StudentRepository::save(Student A){
    string B;
    int check;
    B = A.getName();
//  check = findByName(B);
//
//  if(check != 0){
        students.push_back(Student(A));
//  }
//  else{
//      throw RepoException("Name already exist in the database!");
//  }
}

studentRepo.h

class StudentRepository{
private:
    vector <Student> students;
public:
    vector <Student> getAll();
    void save(Student);
    void edit(Student);
    void delByName(string);
    void searchById();

    int findByName(string name);

    ~StudentRepository();

};

Trace:

    Dr. Memory version 1.4.6 build 2 built on Mar  7 2012 10:14:04
Application cmdline: ""D:\c++\Begin\L_6-8\Debug\L_6-8.exe""
Recorded 62 suppression(s) from default C:\Program Files (x86)\Dr. Memory/bin/suppress-default.txt

Error #1: UNINITIALIZED READ: reading register eax
# 0 _fu36___ZSt4cout                 [D:\c++\Begin\L_6-8\Debug/../UIconsole.cpp:90]
# 1 UIconsole::runUI()               [D:\c++\Begin\L_6-8\Debug/../UIconsole.cpp:19]
# 2 Application::run()               [D:\c++\Begin\L_6-8\Debug/../App.cpp:43]
# 3 main                             [D:\c++\Begin\L_6-8\Debug/../App.cpp:27]
Note: @0:00:10.842 in thread 5436
Note: instruction: mov    (%eax) -> %eax

Error #2: UNADDRESSABLE ACCESS: reading 0x00000004-0x00000008 4 byte(s)
# 0 std::vector<>::push_back()               [c:/mingw/bin/../lib/gcc/mingw32/4.6.1/include/c++/bits/stl_vector.h:828]
# 1 StudentRepository::save()                [D:\c++\Begin\L_6-8\Debug/../StudentRepository.cpp:27]
# 2 Catalog::addNewStudent()                 [D:\c++\Begin\L_6-8\Debug/../Catalog.cpp:7]
# 3 _fu36___ZSt4cout                         [D:\c++\Begin\L_6-8\Debug/../UIconsole.cpp:90]
# 4 UIconsole::runUI()                       [D:\c++\Begin\L_6-8\Debug/../UIconsole.cpp:19]
# 5 Application::run()                       [D:\c++\Begin\L_6-8\Debug/../App.cpp:43]
# 6 main                                     [D:\c++\Begin\L_6-8\Debug/../App.cpp:27]
Note: @0:00:10.853 in thread 5436
Note: instruction: mov    0x04(%eax) -> %edx

Error #3: LEAK 21 direct bytes 0x006ff488-0x006ff49d + 0 indirect bytes
# 0 libstdc++-6.dll!Znwj           
# 1 libstdc++-6.dll!ZNSs7reserveEj 
# 2 libstdc++-6.dll!ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E
# 3 _fu2___ZSt3cin                                                             [D:\c++\Begin\L_6-8\Debug/../UIconsole.cpp:81]
# 4 UIconsole::runUI()                                                         [D:\c++\Begin\L_6-8\Debug/../UIconsole.cpp:19]
# 5 Application::run()                                                         [D:\c++\Begin\L_6-8\Debug/../App.cpp:43]
# 6 main                                                                       [D:\c++\Begin\L_6-8\Debug/../App.cpp:27]

DUPLICATE ERROR COUNTS:

SUPPRESSIONS USED:

ERRORS FOUND:
      1 unique,     1 total unaddressable access(es)
      1 unique,     1 total uninitialized access(es)
      0 unique,     0 total invalid heap argument(s)
      0 unique,     0 total warning(s)
      1 unique,     1 total,     21 byte(s) of leak(s)
      0 unique,     0 total,      0 byte(s) of possible leak(s)
ERRORS IGNORED:
     84 still-reachable allocation(s)
         (re-run with "-show_reachable" for details)
Details: C:\Users\Warzaru\AppData\Roaming/Dr. Memory/DrMemory-L_6-8.exe.8092.000/results.txt

Upvotes: 0

Views: 1322

Answers (2)

stefan bachert
stefan bachert

Reputation: 9608

You mix up memory models.

Your original version has two problems

  • pointer values are undefined. Not null like in java. The debugger may show null but the release version will get undefined for pointers
  • the constructor create objects as automatic vars AND destroy them on leaving. That is surely not want you want.

``

Application::Application(){
  StudentRepository stre();
  StudentValidator stvl();
  Catalog cat();
  UIconsole ui();
}    

When you want to use pointers, use this approach

class Application{
private:
    StudentRepository *stre;
    StudentValidator *stvl;
    Catalog *cat;
    UIconsole *ui;    
public:
    Application();
    ~Application();
    void run();
};    


Application::Application(){
    stre = new StudentRepository();
    stvl = new StudentValidator ();
    cat = new Catalog();
    ui = new UIconsole ();
}    

Application::~Application(){
    delete stre;
    delete stvl;
    delete cat;
    delete ui;
}    

or just add the objects as members. internal access switch from "->" to "."

class Application{
private:
    StudentRepository stre;
    StudentValidator stvl;
    Catalog cat;
    UIconsole ui;    
public:
    // Application(); // no more necessary for this limited case
    // ~Application(); // no more necessary for this limited case
    void run();
};    

Upvotes: 2

chmeee
chmeee

Reputation: 3638

The first problem to note is the Application constructor. The Application class uses pointers as its members, but you are not allocating the data for those pointers. You want to replace the body of the Application constructor with:

[member] = new [member_type];

This will likely solve your crash as well.

Upvotes: 4

Related Questions