在跟黑马老师学习C++的过程中,在职工管理系统的课时遇到了一个BUG.
在文件夹内没有txt文件的时候增加员工并不会报错,而当第二次运行,也就是存在txt文件的时候增加员工就会报错,每次错误都指向:
for (int n = 0; n < this->emp_num; n++) {
f << this->emp_array[n]->id << " " <<
this->emp_array[n]->name << " " <<
this->emp_array[n]->did<< "\n" << endl;
}
也就是向this对象写入数组中成员的属性时候发生错误
这个BUG显示的是读取内存的时候出错了.可以看到读取的位置是一堆FFFFFFFFFFFFFFFF.
然后在增加员工的函数中也发现了一项警告:
可以看到是缓冲区溢出.
解决办法:
在老师的后一节课也有讲到,要重新开辟新空间,因为增加了人数以后旧空间内存不够用,所以在构造函数中要增加两个语句:
this->emp_array = new Worker * [this->emp_num];//开辟空间
this->init_emp();//把文件中数据存放到数组中
init_emp()的函数内容如下
void WorkerManger::init_emp()
{
int index = 0;
ifstream ifs;
ifs.open(FILENAME, ios::in);
int id;
string name;
int did;
while (ifs >> id && ifs >> name && ifs >> did)
{
Worker* p = NULL;
switch (did)
{
case 1:
p = new Employee(id, name, 1);
break;
case 2:
p = new Manager(id, name, 2);
break;
case 3:
p = new Boss(id, name, 3);
break;
default:
break;
}
this->emp_array[index] = p;
index++;
}
ifs.close();
}