C++ Worker类二级指针数组扩容报类型无法赋值错误如何解决
问题排查及修复方案
核心错误原因
- 逻辑判断写反:现有代码中
if (workers != 0)就输出内存分配错误,和实际逻辑完全相反:正常扩容场景下workers本来就是已分配的非空指针,只有新申请的temp为空时才代表内存申请失败。 - 指针拷贝后错误释放原对象:你仅拷贝了
workers[i]的指针地址到temp[i],两个指针指向同一块内存,此时直接delete workers[i]会直接释放该内存块,导致temp[i]变成悬空野指针,后续访问该地址必然触发异常。 - 扩容后的新元素未初始化:你申请的
temp数组长度是numPworking + 1,最后一个元素temp[numPworking]没有赋值,是未定义的野指针,后续操作会触发异常。 - 类型不匹配报错排查方向:如果编译阶段就提示
a value of type cannot be assigned to an entity of type,请确认workers的定义和temp类型完全一致:如果workers被定义为const Worker**、或者是其他和Worker**不兼容的类型,赋值workers = temp时就会触发该类报错,需要修正workers的定义。
修复后的代码示例
void School::plusWorker() { // 申请新的扩容数组,用nothrow避免申请失败直接抛异常 Worker** temp = new (std::nothrow) Worker*[numPworking + 1]; // 只有内存申请失败才输出错误 if (temp == nullptr) { cout << "Error in workers memory allocation" << endl; return; } // 仅拷贝指针地址,不要释放原指向的对象 for (int i = 0; i < numPworking; ++i) { temp[i] = workers[i]; } // 新扩容的位置初始化为空指针,避免野指针 temp[numPworking] = nullptr; // 仅释放旧的指针数组本身,不要释放数组元素指向的对象 delete [] workers; // 更新计数和指针指向 ++numPworking; workers = temp; }
额外注意事项
- 后续需要释放整个
workers数组时,要先遍历释放每个workers[i]指向的对象,再释放workers数组本身,避免内存泄漏。 - 如果
Worker存在派生类,给数组成员赋值指针时需要确保类型兼容,避免触发类型不匹配的编译错误。
内容的提问来源于stack exchange,提问作者yairda2
相关产品推荐
相关产品推荐

