从动态数组中删除数据时的例外情况

时间:2017-12-01 01:29:54

标签: c++ visual-studio dynamic-arrays

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

我参与了一个地址簿项目。主要假设是使用动态数组来存储记录并使用文本文件作为简单的数据库。 有一个类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();
}

我做了show,添加和搜索功能但是在删除记录后我使用数组时遇到了问题。通过此方法正确删除记录:

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

在对象main.cpp的{​​{1}}中调用这些函数。 Visual Studio抛出异常访问冲突读取位置。我不知道我可以改变什么以避免抛出这些异常。删除记录后会抛出异常 - 一切正常,直到删除记录。

1 个答案:

答案 0 :(得分:1)

saveToFile功能中,您尝试打印tableCap条记录数:

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

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

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

因此,您将超出数组的范围,导致访问冲突。