系统.Visual Studio 2008中的AccessViolationException

System.AccessViolationException in Visual Studio 2008

本文关键字:中的 AccessViolationException 2008 Studio Visual 系统      更新时间:2023-10-16
// diskbin.cpp : main project file.
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <stdio.h>
#include <sys/stat.h>
using namespace std;
int main( int argc, char *argv[] )
{
  //code
  if(stat("key.pc.db", &filek) ==0 )
      sizek=filek.st_size;
  if(stat("seek.pc.db", &files) ==0 )
      sizes=files.st_size;
  sizek=sizek/sizeof(int);
  sizes=sizes/sizeof(int);
  int i,min,max,mid;
  int *s=new int[sizes];
  int *hit=new int[sizes];
  //code
}

当我在Visual Studio 2008中运行这个程序时,我没有得到任何错误,但是当我运行cmd打开然后关闭时,弹出窗口显示:"类型为'System '的未处理异常。在diskbin.exe中发生了AccessViolationException附加信息:试图读取或写入受保护的内存。这通常表明其他记忆已经损坏。"有什么问题吗?我没有正确分配s和命中吗?

谢谢!

程序会崩溃,因为你使用了未初始化的变量:

  int       sizes, sizek;
  struct stat files, filek;
  ofstream ofs;
  if(stat("key.pc.db", &filek) ==0 )
      sizek=filek.st_size;
  if(stat("seek.pc.db", &files) ==0 )
      sizes=files.st_size;
  sizek=sizek/sizeof(int);
  sizes=sizes/sizeof(int);

如果stat()失败,则使用未初始化的sizek。根据未初始化的内存,您的下一条语句将崩溃:

int *s=new int[sizes];

因为sizes可以是负数或非常大的数字,new将失败。

检查stat()返回的错误,尽管可能没有找到文件key.pc.db,导致函数失败