【问题标题】:Unhandled exception at 0x00C61540 in Project3.exe: 0xC0000005: Access violation reading location 0x00000003Project3.exe 中 0x00C61540 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000003
【发布时间】:2014-06-18 03:25:01
【问题描述】:

每当我再次运行此程序时都会遇到错误。基本上它所做的是将一些信息写入文件,如果文件不存在则创建文件。但是,当它第二次运行时,它需要读取之前创建的文件,由于某种原因引发了异常,我得到了这个错误:

Project3.exe 中 0x00C61540 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000003。

调试器指向函数getBalance中的第15行作为抛出异常的地方。但是,我实际上不止一次调用了这个函数,并且它只是在我第二次调用它时抛出了异常。

int getBalance(int lineno){ // Funciton to convert strings in file to ints
    string balance;
//Getting information from the file about locations
int *pointer;
pointer = findNewLines();
static int linenopos[10];

for (int i = 0; i < 11; i++){
    linenopos[i] = *(pointer + i);
}

int balanceInt;

//Opening file
balanceFile.open("E:\\MoneyStuff\\balance.txt", ios::in | ios::out); //Exception is thrown here

//Getting Balances
balanceFile.seekg(linenopos[(lineno - 1)], ios::beg);
getline(balanceFile, balance);

balanceFile.close();

stringstream convert(balance);//Variable to convert string balance to integer balance

//Converting balance string to int
convert >> balanceInt;

//Setting balanceInt to 0 if the file doesn't exist
if (balanceInt < -30000)
    balanceInt = 0;

return balanceInt;
}

编辑:好的,所以我更正了代码中我试图访问不存在的数组中的元素的部分,但我仍然遇到相同的异常。该异常似乎仅在我尝试从以前创建的文件中读取时发生,所以它可能与权限有关吗?

注意:这是我第一次在这里提问,所以如果我需要给你们更多代码或更多信息,请告诉我!谢谢

【问题讨论】:

  • 除了你的主要问题之外的一些其他问题:你应该初始化balanceInt,或者检查&gt;&gt;是否失败。正如你所拥有的,如果convert &gt;&gt; balanceInt 失败(例如balance 不包含可读整数),那么当你检查-30000 时,你会访问一个未初始化的值。
  • 在执行linenopos[lineno - 1] 之前,您还必须检查lineno &gt; 0lineno &lt;= 10。如果您更改代码以便 findNewLines 返回 vector&lt;streampos&gt; ,那会好一千倍。那么就没有大小限制了,可以使用vector的.at()成员函数来避免越界访问。
  • 嗨!我的回答解决了你的问题?如果是,请检查为“正确”,如果不是,请告诉我缺少什么。

标签: c++


【解决方案1】:

当您声明一个包含 10 个元素的数组时,这意味着您的索引从 0 变为 9

将循环调整为:

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

试图访问数组中不存在的元素会导致奇怪的行为,崩溃就是其中之一。

至于open()引起的异常,抓住它并打印到屏幕上以了解发生了什么事情的一些线索:

try {
    balanceFile.open("E:\\MoneyStuff\\balance.txt", ios::in | ios::out);
}
catch (const std::exception& e ) {
     std::cout << e.what() << std::endl;
}

【讨论】:

  • 嗯,从技术上讲,它可以做任何事情, 不仅仅是崩溃,而是 +1,因为这几乎肯定是根本原因。
  • 感谢您提供此信息,我不知道当您声明它时它不是从 0 开始计数的......但是,我尝试了这个,它仍然抛出相同的异常。另外,它只发生在我从创建的文件中读取时,所以我认为这不是问题
【解决方案2】:

如果错误代码显示“访问冲突读取位置 0x00000003”,则表示您正在尝试从 null+3 读取值。

您的 findNewLines() 函数可能没有返回您想要的结果。

【讨论】:

    【解决方案3】:

    您的 for 循环有 11,请参阅:

    static int linenopos[10];
    
    for (int i = 0; i < 11; i++){
    

    正确的是“10”:

    static int linenopos[10];
    
    for (int i = 0; i < 10; i++){
    

    但最好的方法是在循环之前计算项目(任何机会你会升级你的向量),尝试:

    static int linenopos[10];
    
    int size = sizeof(linenopos) / sizeof(linenopos[0]);//count items
    
    for (int i = 0; i < size ; i++){
    

    或使用矢量大小,如下所示:

    const int size = 10;//vector size
    
    static int linenopos[size];
    
    for (int i = 0; i < size ; i++){
    

    【讨论】:

      【解决方案4】:

      在你的代码中

      static int linenopos[10];
      for (int i = 0; i < 11; i++)
      

      您遍历 linenopos 数组的末尾。

      你应该有

      for (int i = 0; i != 10; ++i)
      

      【讨论】:

      猜你喜欢
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 2020-12-31
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多