2017-12-01 11 views
-1

ここに質問する人がいないので、ここで誰かが何が起こっているか知ってくれることを願っています。ダイナミックアレイからデータを削除する際の例外

私はアドレスブックプロジェクトに取り組んでいます。主な前提は、動的配列を使用してレコードを格納し、テキストファイルを単にデータベースとして使用することです。 クラスRecordは名前、姓、番地、住宅番号などのデータで構成されています。レコードはクラスAdressBookの動的配列に格納されます。アプリケーションには、終了編集レコードの表示、追加、検索、削除などの機能が必要です。プログラムが起動すると、.txtファイルからのデータが配列にロードされ、プログラムが終了すると、配列からテキストファイルにすべてのオブジェクトが保存されます。これは私のAdressBookクラスです:

class AdressBook 
{ 
    int tableCap_; 
    Record *recordTable_; 
    int recordNum_; 
public: 
    AdressBook(); 
    int getTableCap(); 
    bool addRecord(const Record& newRecord); 
    Record getRecord(int); 
    void deleteRecord(); 
    void searchRecord(); 
    bool readFromFile(); 
    bool saveToFile(); 
} 

私は、ショーを作っ追加し、検索機能が、私はレコードを削除した後、アレイでの作業に問題があります。レコードはこの方法で正しく削除されています:

void AdressBook::deleteRecord() 
{ 
    // some code where i search record to delete 
      Record *tempTable = new Record[tableCap_ - 1]; 
      for (int j = 0; j < i; j++) 
       tempTable[j] = recordTable_[j]; 
      for (int j = i; j < tableCap_ - 1; j++) 
       tempTable[j] = recordTable_[j+1]; 
      delete[] recordTable_; 
      recordTable_ = tempTable; 
      recordNum_--; 
} 

私が言ったように。レコードを削除するとうまくいきます。配列に対して何らかのアクションを再度実行したいときに問題が表示されます。たとえばsaveToFile機能:

bool AdressBook::saveToFile() 
{ 
    ofstream ofs("save.txt", ios::out | ios::trunc); 
    for (int i = 0; i < getTableCap(); ++i) 
    { 
     ofs << recordTable_[i].name << endl; 
     ofs << recordTable_[i].surname << endl; 
     ofs << recordTable_[i].street << endl; 
     ofs << recordTable_[i].houseNumber << endl; 
     ofs << recordTable_[i].postalCode << endl; 
     ofs << recordTable_[i].city << endl; 
    } 
    return 1; 
    } 
} 

Recordクラスは:

class Record 
{ 
public: 
    string name, surname, street, houseNumber, postalCode, city; 
    int classNumber; 

    Record(string, string, string, string, string, string); 
    Record(); 
    ~Record(); 

    friend istream& operator>>(fstream&, Record& t); 
}; 

これらの機能は、オブジェクトPhoneBook phoneBookmain.cppで呼び出されます。 ビジュアルスタジオが例外をスローするアクセス違反の読み取り場所。私はこれらの例外を投げるのを避けるために何を変えることができないのか分かりません。例外はレコードを削除した後にスローされます。あなたのsaveToFile機能で

+1

なぜベクターを使用しないのですか? –

+0

"これらの例外をスローするのを避けるために変更する"ことは、プログラムのメモリ破損の原因となるバグを見つけて修正することです。コードのどこかにバグがあり、その結果、未定義の動作と破損が発生し、コード内のその時点で現れます。ある特定のポイントでプログラムがクラッシュしたとしても、そのバグはどこにあるのか分かりません。バグはコード内のどこにでも置くことができます。あなたはそれを理解して修正する必要があります。 –

+0

'recordNum_'と' tableCap_'の違いは何ですか? – 1201ProgramAlarm

答えて

1

、あなたがレコードのtableCap数印刷しようとしている。

for (int i = 0; i < getTableCap(); ++i) 

をしかし、あなただけのdeleteRecord機能のレコードのtableCap - 1数を割り当てた:

Record *tempTable = new Record[tableCap_ - 1]; 

したがって、あなたが行っていますアレイの境界の外側でアクセス違反の原因となります。

+0

これは唯一の問題ではないかもしれません。上記の私のコメントを参照してください。 – PaulMcKenzie

+0

これは手掛かりです!私は 'tableCap_'値を変更することを忘れています。 'tableCap - 1'の代わりに' tableCap _- = 1; '行を追加し、メモリ割り当てに' tableCap_'値を使用しました。手伝ってくれてありがとう!私は解決策を思いつきません:) – syzmon9

関連する問題