从动态数组中删除数据时出现异常

Exceptions during removing data from dynamic array

我这里没有人可以问,所以我希望这里有人知道发生了什么事。

我从事地址簿项目。主要假设是使用动态数组存储记录并使用文本文件作为简单的数据库。 有classRecord,由姓名、街道、门牌号等数据组成,记录存储在classAdressBook中的动态数组中。应用程序应具有显示、添加、搜索、删除编辑记录等功能。当程序启动时,.txt 文件中的数据被加载到数组中,当程序结束时,它会将数组中的所有对象保存到文本文件中。这是我的地址簿 class:

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

记录class:

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 中调用。 Visual studio 抛出异常 访问冲突读取位置 。我不知道我可以改变什么来避免抛出这些异常。删除记录后抛出异常 - 在删除记录之前一切正常。

在您的 saveToFile 函数中,您正在尝试打印 tableCap 条记录:

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

但是您在 deleteRecord 函数中只分配了 tableCap - 1 条记录:

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

因此您超出了数组的边界,导致访问冲突。