顾青山97 2022-11-13 16:43 采纳率: 0%
浏览 23

关于缓冲区 溢出解决的疑问

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]】,为何添加了四个字节解决了缓冲区内存溢出的问题?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-11-13 18:34
    关注
    • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:缓冲区溢出的危害
    评论

报告相同问题?

问题事件

  • 创建了问题 11月13日

悬赏问题

  • ¥15 如何扩大AIS数据容量
  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?