程序在VS2008中运行良好,在程序的最后在VS2010中抛出异常
Program works fine in VS 2008, throws exception in VS 2010 at the very end of program
我正在使用二进制/直接访问写入一个文件。在2008年像一个符咒一样工作,但在2010年运行时在第128行创建了一个异常:Unhandled exception at 0x535dad54 (msvcp100d.dll) in HovedProsjekt.exe: 0xC0000005: Access violation writing location 0xfeeefeee.
单击错误将转到xutility,第201行:_Pnext != 0; *_Pnext = (_Pnext)->_Mynextiter)
是下一个要执行的行。我看了一下微软的"突破性更改"页面,运气并不好。我正在用明文复制/粘贴整个代码,所以没有过时的库。我已经尝试了启用和禁用_HAS_ITERATOR_DEBUGGING和_SECURE_SCL的所有组合。我根据另一位用户的建议更改了我的问题,以精简我的代码。
//Miniprosjekt.cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
bool sjekkForOverskriving(void);
void LagFil(void);
void LeggTil();
void skrivUtFeil();
class Feil{
friend ostream& operator<<(ostream&, Feil);
friend istream& operator>>(istream&, Feil&);
protected:
int ID;
int prioritet;
string dato;
char beskrivelse[300];
char skrevetAv[30];
public:
Feil();
Feil(int, int, string, string, string);
};
Feil::Feil(){ //Default constructor
ID = 0;
prioritet = 1;
dato = "01.01.1900";
beskrivelse[0] = ' ';
skrevetAv[0] = ' ';
}
Feil::Feil(int id, int pri, string d, string beskr, string navn){ //Constructor
ID = id;
prioritet = pri;
dato = d;
strcpy(beskrivelse, beskr.c_str());
strcpy(skrevetAv, navn.c_str());
}
ostream& operator<<(ostream& out, Feil enfeil) //Overloader << operator, allowing for: cout << Feil afeil
{
out << "Id nr: " << enfeil.ID << "nSkrevet av: " << enfeil.skrevetAv << "nDato: " <<
enfeil.dato << "nPrioritet: ";
if(enfeil.prioritet == 1)out << "Lav";
else if(enfeil.prioritet == 2)out << "Middels";
else out << "Høy";
out << "nBeskrivelse:n" << enfeil.beskrivelse << endl;
return out;
}
istream& operator>>(istream& in, Feil& enfeil) //Overloader >> operator: allowing for cin >> Feil afeil
{
in >> enfeil.ID >> enfeil.dato >> enfeil.beskrivelse >> enfeil.skrevetAv;
return in;
}
int main(void){
LagFil();
LeggTil();
skrivUtFeil();
return 0;
}
void LagFil(void){ //Creates a file with 500 empty "feil" objects
const int MAXFEIL = 500;
Feil enfeil;
ofstream utFil;
utFil.open("FeilTeller.dat");
utFil << 0;
utFil.close();
utFil.open("Feilmeldinger.dat", ios::out | ios::binary);
for(int a = 0; a <= MAXFEIL; a++){ //Fills the file with empty "Feil" objects
utFil.write(reinterpret_cast <const char*>(&enfeil), sizeof(enfeil));
}
utFil.close();
}
void LeggTil(){
int ID;
ifstream innFil;
innFil.open("FeilTeller.dat");
innFil >> ID;
innFil.close();
fstream fil;
fil.open("FeilTeller.dat");
ID++; //Opens feilteller.dat, reads how many objects have already been created. Adds one to that to append.
fil << ID;
fil.close();
int pri = 1;
string beskrivelse = "test";
string dato = "test2";
string skrevetAv = "test3";
Feil enfeil(ID, pri, dato, beskrivelse, skrevetAv);
fil.open("Feilmeldinger.dat", ios::out | ios::in | ios::binary);
fil.seekp((ID - 1) * sizeof(enfeil));
fil.write(reinterpret_cast <const char*>(&enfeil),
sizeof(Feil));
fil.close();
}
void skrivUtFeil(){
int idnr = 1;
//for(int i = 0; i < 2; i++){
Feil enfeil;
int antallFeil;
ifstream innFil;
innFil.open("FeilTeller.dat");
innFil >> antallFeil;
innFil.close();
innFil.open("Feilmeldinger.dat", ios::in | ios::binary);
innFil.read(reinterpret_cast <char*>(&enfeil),
sizeof(Feil));
innFil.clear();
//Prints out Feil with ID "idnr"
innFil.seekg((idnr - 1) * sizeof(enfeil));
innFil.read(reinterpret_cast <char*>(&enfeil),
sizeof(Feil));
cout << enfeil << endl;
cout << "Totalt antall feil: " << antallFeil << endl;
system("pause");
innFil.close();
//}
} //Exception on this line
您的类Feil
包含string dato
,因此它不是可复制的。因此,将其作为原始二进制数据写入和读取是非法的。
如果你这样做会发生什么?std::string
包含一个指向字符数组的指针,所以您编写它的值,而不是内容。当您读取它时,您将相同的值读取到指针中,但它指向的是垃圾。
相关文章:
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 我的C++程序只写入文本文件最后一个条目
- 程序应该显示文件的最后5行,但它不适用于大文件
- C++ 链表程序打印最后一个数据项 n 次
- 为什么两个程序中的总和值在最后不同?
- 以下递归程序的最后一行是如何工作的
- 如何在应用程序进行大量printf时,在固定输入的终端中设置最后一行
- C++程序在迭代到数组的最后一个元素时崩溃
- 当该应用程序中加速文件的最后一个修改时间发生更改时,如何重新启动应用程序
- 试图删除最后一个std ::向量元素时,程序会崩溃
- 合并排序程序总是有效的,但有时会在最后说中止陷阱
- 为什么当我在Visual c ++ studio 2010中运行应用程序时光标会转到最后一个文本框
- 最后挂接一个程序
- 当我采用测试用例数 = 1 时,我的程序终止.其他明智的是,它给出了正确的答案,但跳过了最后一个测试用例
- 我在一个简单控制台程序(c++)中的第一列代码最终成为我的最后一列
- 使Qt应用程序在最后一个窗口关闭时不退出
- 调用函数后,程序不会运行到最后
- 为什么我的程序最后崩溃了
- 我的代码编译,执行,但程序最后崩溃
- msxml程序最后一行出错