我是C ++的新手。谁能解释我为什么用下面的代码给出堆异常。我试图从具有不同Student对象的Student类型创建数组。该代码有时会成功编译,有时会返回-1073741510并需要更长的时间。
#include <iostream>
using namespace std;
class Student{
private:
const char* vn;
const char* nn;
int mn;
int fs;
public:
Student() = default;
Student(const char* vn, const char* nn, int mn, int fs): vn(vn), nn(nn), mn(mn), fs(fs){}
const char* getVn() {
return vn;
}
const char* getNn() {
return nn;
}
int getMnr() {
return mn;
}
int getFs() {
return fs;
}
};
class Verwaltung{
private:
unsigned counter = 0;
Student *s = new Student[counter];
public:
void add(Student &student){
s[counter]=student;
cout << counter << " " << s[counter].getNn() << " " << s[counter].getVn() << " " << s[counter].getMnr() << " " << s[counter].getFs() << endl;
++counter;
}
};
int main(){
Student s1("Micha", "Nugel", 3213, 8);
Student s2("Mohan", "Sasa", 32211, 3);
Student s3("Johan", "Goat", 3213, 2);
Student s4("Meise", "Kreise", 3123, 1);
Verwaltung v;
v.add(s1);
v.add(s2);
v.add(s3);
v.add(s4);
}
嗯,看看这两行代码:
class Verwaltung{
unsigned counter = 0;
Student *s = new Student[counter];
}
因此,您的s
指针将指向一个0大小的数组,因此您将向所有学生分配未分配的内存,并且如果该内存不属于您的程序,或者还有其他内容在它上面,您将破坏内存,因此您的程序将失败。
如果您希望所有这些检查都自动完成,请使用std::vector
Infact,错误-1073741510对应于0xc000013a,这是一个错误信号,表明程序已异常停止(这种情况可能是由SO为了防止内存损坏或出于安全原因,例如“不读取其他程序内存” )