【问题标题】:C++ Exception throwC++ 异常抛出
【发布时间】:2016-11-19 21:23:28
【问题描述】:

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

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

【问题讨论】:

  • 我可能可以克服这里的语言障碍,但是没有输入文件就很难重现。
  • 您可以尝试将违规代码放入try { ... } catch(...) {} 块中,但我认为您应该找到访问冲突的原因。既然你已经调试了你的程序,你能在你的程序中标记导致访问冲突的行吗?

标签: c++ exception throw


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2010-09-13
    相关资源
    最近更新 更多