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里面的?
你的代码是初次执行就报错,还是执行到第二次的时候报错?