oid WorkerManger::Add_Emp()
{
cout << "请输入添加职工数量:" << endl;
int addNum = 0; // 保存用户输入数量
cin >> addNum;
if (addNum > 0)
{
// 添加员工,计算添加新空间大小
int newSize = this->m_EmpNum + addNum; // 新空间人数 = 原来记录人数 + 新增人数
// 开辟新空间
Worker ** newSpace = new Worker_*[newSize + 4];
// 这里是将新申请的指针数组的地址赋给二级指针newSpace
// 返回的是指针数组的首地址,但是数组元素是指针,如果要访问数组1元素对应的内容,就需要二次解引用
// 将原来空间下的数据,拷贝到新空间下
if (this->m_EmpArray != NULL)
{
for (int i = 0; i < this->m_EmpNum; i++)
{
newSpace[i] = this->m_EmpArray[i];
}
}
// 批量添加新数据
for (int i = 0; i < addNum; i++)
{
int id;
string name;
int dSelect;
cout << "请输入第:" << i + 1 << "个职工编号" << endl;
cin >> id;
cout << "请输入第:" << i + 1 << "个职工姓名" << endl;
cin >> name;
cout << "请选择职工岗位" << endl;
cout << "1.普通职工" << endl;
cout << "2.经理" << endl;
cout << "3.总裁" << endl;
cin >> dSelect;
Worker * worker = NULL;
// 初始化防止野指针
// new继承父类指针
switch (dSelect)
{
case 1:
worker = new Employee(id, name, 1);
break;
case 2:
worker = new Manager(id, name, 2);
break;
case 3:
worker = new Boss(id, name, 3);
break;
default:
break;
}
// 将创建的职工职责,保存到数组中
newSpace[this->m_EmpNum + i] = worker;
}
// 释放原有空间
delete[] this->m_EmpArray;
// 更改新空间
this->m_EmpArray = newSpace;
// 更新新的职工人数
this->m_EmpNum = newSize;
// 更新职工不为空标志
this->m_FileIsEmpty = false;
// 提示添加成功
cout << "成功添加" << addNum << "名新职工" << endl;
this->save();
}
else
{
cout << "输入有误,请再次输入" << endl;
}
// 按任意键清屏回到上一目录
system("pause");
system("cls");
}
这是解决内存溢出的后的代码
以下是未解决内存溢出时候的代码:
void WorkerManger::Add_Emp()
{
cout << "请输入添加职工数量:" << endl;
int addNum = 0; // 保存用户输入数量
cin >> addNum;
if (addNum > 0)
{
// 添加员工,计算添加新空间大小
int newSize = this->m_EmpNum + addNum; // 新空间人数 = 原来记录人数 + 新增人数
// 开辟新空间
Worker ** newSpace = new Worker*[newSize];
// 这里是将新申请的指针数组的地址赋给二级指针newSpace
// 返回的是指针数组的首地址,但是数组元素是指针,如果要访问数组1元素对应的内容,就需要二次解引用
其区别在于【Worker ** newSpace = new Worker*[newSize]】与 【Worker ** newSpace = new Worker*[newSize+4]】,为何添加了四个字节解决了缓冲区内存溢出的问题?