C ++异常抛出

时间:2016-11-19 21:23:29

标签: c++ exception throw

我制作了一个程序,当我调试它时崩溃并向我显示错误:

Project1.exe中的0x0FC93AA8(vcruntime140d.dll)抛出异常:0xC0000005:访问冲突读取位置0x8BADB618。

如果存在此异常的处理程序,则可以安全地继续该程序。

任何想法可能是什么?

#include <iostream>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;


class bendraAbonentoInformacija
{
public:
string vardasPavarde;
string asmensKodas;
string adresas;
double suma;
string tiekejas;

};
class elektra : public bendraAbonentoInformacija
{
public:
    double tarifas;
    int skaitiklisNuo;
} rect;
class siuksles : public bendraAbonentoInformacija
{
public:
int kvadratura;
};
class vanduo : public bendraAbonentoInformacija
{
public:
int saltasVanduo;
int sildymas;
};

void nuskaitymas(int& i, bendraAbonentoInformacija masyvas[], elektra elektrosMasyvas[], siuksles siuksliuMasyvas[], vanduo vandensMasyvas[])
{
ifstream duomenuNuskaitymas;
duomenuNuskaitymas.open ("duomenys.txt");
string vardasPavarde;
string asmensKodas;
string adresas;
double suma;
string tiekejas;
int tarifas;
double skaitliukas;
int kvadratura;
int saltasVanduo;
int sildymas;

i = 0;

if (duomenuNuskaitymas.is_open())
{
    while (!duomenuNuskaitymas.eof())
    {

        duomenuNuskaitymas >> masyvas[i].vardasPavarde >> masyvas[i].asmensKodas >> masyvas[i].adresas >> masyvas[i].suma >> masyvas[i].tiekejas;

        if (masyvas[i].tiekejas == "Vilniaus energija")
        {
            duomenuNuskaitymas >> elektrosMasyvas[i].tarifas >> elektrosMasyvas[i].skaitiklisNuo;

        }
        else if (masyvas[i].tiekejas == "Kauno svara")
        {
            duomenuNuskaitymas >> siuksliuMasyvas[i].kvadratura;
        }
        else if (masyvas[i].tiekejas == "Rokiskio vandenys")
        {
            duomenuNuskaitymas >> vandensMasyvas[i].saltasVanduo >> vandensMasyvas[i].sildymas;
        }

        i++;

    }

    duomenuNuskaitymas.close();
}

else cout << "Unable to open file";

}

void PaieskaPagalAsmensKodaIrRikiavimas(int i, bendraAbonentoInformacija masyvas[])
{
string AsmensKodas;
bendraAbonentoInformacija abonentas[1000];
bendraAbonentoInformacija Kintamasis;
int k = 0;

cout << "Iveskite asmens, kurio saskaitos ieskote, asmens koda: ";
cin >> AsmensKodas;

cout << "Rasta informacija:" << endl;

for (int j = 0; j < i; j++)
{
    if (AsmensKodas == masyvas[j].asmensKodas)
    {
        cout << masyvas[j].vardasPavarde << masyvas[j].adresas << masyvas[j].asmensKodas << masyvas[j].suma;
        abonentas[k] = masyvas[j];
        k++;
    }
}

for (int i = 0; i < k; i++)
{
    if (abonentas[i].suma < abonentas[i + 1].suma)
    {
        Kintamasis = abonentas[i];
        abonentas[i] = abonentas[i + 1];
        abonentas[i + 1] = Kintamasis;
    }
}

for (int i = 0; i < k; i++)
{
    cout << abonentas[i].vardasPavarde << abonentas[i].suma;
}

}


int main()
{

int i;
bendraAbonentoInformacija masyvas[1000];
elektra elektrosMasyvas[1000];
siuksles siuksliuMasyvas[1000];
vanduo vandensMasyvas[1000];

nuskaitymas(i, masyvas, elektrosMasyvas, siuksliuMasyvas, vandensMasyvas);
//PaieskaPagalAsmensKodaIrRikiavimas(i,masyvas);

return 0;
}

1 个答案:

答案 0 :(得分:0)

如果执行了足够多次的while循环迭代,nuskaitymas中的数组访问可能超出范围。考虑使用动态大小的数据类型,如std::vector

std::ifstream的使用也可以改进。而不是!duomenuNuskaitymas.eof(),请使用!duomenuNuskaitymas。此外,不需要明确关闭std::ifstream。当对象超出范围并调用析构函数时,将执行此操作。最后,我会检查从std::ifstream读取是否成功。如果不是,那么你将无法读入新值,同时递增索引并且永远不会到达文件末尾。