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
没有正确的复制语义,这可能会导致内存损坏。很遗憾,我不能使用vectorrecordNum\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];