You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:48:03