为何调用remove函数后classRosterArray元素仍能被printAll输出?
问题根源分析
delete后未清空数组指针:你在remove函数里执行
delete只是释放了Student对象占用的内存,但数组中对应位置的指针并没有被设置为nullptr。这块被释放的内存现在是野指针,指向的区域可能还残留着之前的学生数据,所以printAll遍历的时候依然能读到这些残留值,看起来像是学生没被删除。printAll未做空指针判断:你的printAll函数应该是直接遍历整个classRosterArray,没有检查每个元素是否为有效的指针(即是否为
nullptr)。不管指针是否已经被释放,都直接访问并输出,导致已经被删除的学生数据依然被打印出来。
修复方案
在remove函数中,delete目标对象后,立刻将数组中对应的指针赋值为
nullptr:// 找到目标ID对应的数组索引index后 delete classRosterArray[index]; classRosterArray[index] = nullptr; // 关键:清空指针修改printAll函数,遍历数组时先判断当前元素是否为
nullptr,只有非空的指针才执行输出操作:for (int i = 0; i < maxSize; ++i) { if (classRosterArray[i] != nullptr) { // 先检查指针有效性 classRosterArray[i]->print(); } }
内容的提问来源于stack exchange,提问作者Hammerspace
相关产品推荐
相关产品推荐

