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

}

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();

};

痕跡:

    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コンストラクターの本体を次のように置き換えます。

[メンバー]=新しい[メンバータイプ];

これにより、クラッシュも解決する可能性があります。

于 2012-05-15T13:00:44.290 に答える
2

メモリモデルを混同します。

元のバージョンには2つの問題があります

  • ポインタ値は未定義です。Javaのようにnullではありません。デバッガーは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 に答える