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是虚基类(抽象类),不知道怎么做

在你的代码中,你正在使用 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操作释放。

worker不就是一级指针吗,不是已经new了吗
感觉问题不在newSpace 上,你为什么回手delete[] this->m_workerArr,把它删了干什么
你的newSpace 最终又是怎么赋值回this->m_workerArr里面的?
你的代码是初次执行就报错,还是执行到第二次的时候报错?