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

C++ 从动态数组中删除数据时出现异常,c++,visual-studio,dynamic-arrays,C++,Visual Studio,Dynamic Arrays,我这里没有人可以问,所以我希望这里有人知道发生了什么 我在一个地址簿项目上工作。主要假设是使用动态数组存储记录,并使用文本文件作为简单的数据库。 有类记录,由姓名、姓氏、街道、门牌号等数据组成。记录存储在类地址簿中的动态数组中。应用程序应具有显示、添加、搜索、删除结束编辑记录等功能。当程序启动时,将.txt文件中的数据加载到数组中,当程序结束时,它会将数组中的所有对象保存到文本文件中。这是我的地址簿课程: class AdressBook { int tableCap_; Rec

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

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

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_--;
}
记录类别:

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电话簿
上的
main.cpp
中调用。
Visual studio在读取位置引发异常访问冲突。我不知道我可以更改什么来避免抛出这些异常。删除记录后会引发异常-在删除记录之前,一切正常。

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

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

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

为什么不使用vector?您可以“更改以避免引发这些异常”的方法是查找程序中导致内存损坏的任何错误,并修复它。代码中的某个地方有一个bug,它会导致未定义的行为和损坏,并在代码中的该点上表现出来。仅仅因为一个程序在某个特定点崩溃并不意味着这就是错误所在。错误可能存在于代码中的任何地方,您需要找出并修复它。
recordNum\u
tableCap\u
之间有什么区别?请发布
Record
。此函数
getRecord(int)按值返回记录。如果在任何地方调用该函数,并且
Record
没有正确的复制语义,这可能会导致内存损坏。很遗憾,我不能使用vector
recordNum\uu
从1开始,而
tableCap\uu
从0开始。我在其他函数中使用它。这可能不是唯一的问题。看我上面的评论。这是一个线索!我忘了更改
tableCap\uu
值。而不是
tableCap-1
i添加了行
tableCap_-=1并在内存分配中使用
tableCap
值。谢谢你的帮助!我不会想出解决办法:)
for (int i = 0; i < getTableCap(); ++i)
Record *tempTable = new Record[tableCap_ - 1];