0

你好,我尝试了我能想到的一切来修复崩溃......但没有得到任何东西。所以我会尝试粘贴程序的主要组件,所以也许有人可以帮助解决这个问题……程序编译没有错误,但它崩溃了。如果我运行该程序,请先选择“1”而不是输入输入...当它分开时,它就会save崩溃。代码的某些部分被注释掉了,因为我试图找到崩溃的根源。如果我忘记了什么或者您需要其他详细信息,请向 SORRY 索取长代码。主要功能及应用类:

#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(选择输入):

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;
//  }

}

目录.cpp:

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

}

学生回购.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!");
//  }
}

学生报告.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();

};

痕迹:

    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
4

2 回答 2

4

第一个要注意的问题是 Application 构造函数。Application 类使用指针作为其成员,但您没有为这些指针分配数据。您想将 Application 构造函数的主体替换为:

[成员] = 新 [成员类型];

这也可能会解决您的崩溃问题。

于 2012-05-15T13:00:44.290 回答
2

你混淆了内存模型。

你原来的版本有两个问题

  • 指针值未定义。不像java 中那样为空。调试器可能会显示为null,但发布版本将未定义指针
  • 构造函数将对象创建为自动变量并在离开时销毁它们。那肯定不是你想要的。

``

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

当你想使用指针时,使用这种方法

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;
}    

或者只是将对象添加为成员。内部访问从“->”切换到“.”

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();
};    
于 2012-05-15T13:08:40.060 回答