System.AccessViolationException в Visual Studio 2008 - PullRequest
0 голосов
/ 05 сентября 2011
// 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 открывается, а затем закрывается, после чего появляется всплывающее окно с сообщением: «Необработанное исключение типа« Система ».AccessViolationException 'произошло в diskbin.exe Дополнительная информация: Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена. "В чем может быть проблема?Разве я не выделил s и ударил правильно?

Спасибо!

1 Ответ

2 голосов
/ 05 сентября 2011

Это происходит сбой, потому что вы используете неинициализированные переменные:

  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 может быть отрицательным или очень большим числом, а новое не будет выполнено.

Проверьте ошибку, возвращаемуюstat (), хотя возможно, что файл key.pc.db не найден, что приводит к сбою функции.

...