学习js宏的小菜鸡 2023-01-12 11:17 采纳率: 0%
浏览 29

C++动态申请内存仍显示缓冲区溢出

问题遇到的现象和发生背景
int num;
    cout << "请输入添加职工的个数:";
    cin >> num;
    if (num > 0 ) {
        int newSize = this->m_workernum + num;  //新的人数
        Worker* * newSpace = new Worker * [newSize];
        if (this->m_workerArr != nullptr) {
                        //加入原有数据
            for (int i = 0; i < this->m_workernum; i++) {
                                //网上的解决方法是在这里给一级指针开辟空间
                newSpace[i] = this->m_workerArr[i];
            }
        }
        for (int i = 0; i < num; i++) {
            int Id;
            string Name;
            int deptId;
            cout << "输入第" << i + 1 << "职工的编号:" ;
            cin >> Id;
            cout << "输入第" << i + 1 << "职工的姓名:" ;
            cin >> Name;
            cout << "1.员工" << endl;
            cout << "2.经理" << endl;
            cout << "3.老板" << endl;
            cout << "请选择第" << i + 1 << "职工的岗位:" ;
            cin >> deptId;
            Worker* worker = nullptr;
            switch (deptId) {
            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_workernum + i] = worker;
        }
        delete[] this->m_workerArr;
        cout << "成功添加了" << num << "名新职工" << endl;
    }

######刚开始学c++求大佬指点newSpace[this->m_workernum + i] = worker;显示缓冲区溢出
网上查到过一个类似的,说一级指针也要开辟内存空间,但我的Worker是虚基类(抽象类),不知道怎么做

  • 写回答

3条回答 默认 最新

  • m0_54204465 2023-01-12 11:24
    关注

    在你的代码中,你正在使用 new 操作符来动态分配内存,用来存储一个 Worker 指针数组。这个数组存储了多个指向不同类型的 Worker 子类对象的指针。

    在这个数组中,每一个元素都是一个一级指针,它是一个指向一个Worker对象的指针,而这个Worker对象是由 new 操作符创建的。在你这个例子中,你进行了

    newSpace[this->m_workernum + i] = worker;
    
    

    这句话的操作,它给newSpace[i] 赋值,并且newSpace[i]是一个指向Worker对象的指针。

    这里有一个问题,你并没有对 worker 指针进行 new 操作, 也就是说, worker 指针并没有指向一块动态分配的内存, 而是指向了一块未知的内存。

    这样在你访问newSpace[i] 的时候就会出现问题, 你应该对每一个worker进行new操作,申请内存, 然后再赋值。

    switch (deptId) {
            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;
        }
    
    

    还有需要注意的是,程序中使用new操作申请的内存需要在程序结束的时候使用delete操作释放。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月12日

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析