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

队列场景下,在其他函数中分配的process结构体该如何正确释放?

队列结构体内存释放解决方案
  • 核心逻辑:你分配的process结构体是存入队列的,生命周期要和队列中该节点的有效期对齐,正确的释放时机是进程执行完毕出队的时候,不能在入队函数里释放。

第一步:实现专门的process销毁函数

process结构体内部包含两块堆内存:processName(main函数中malloc分配)、processData(initializeProcessData函数分配),不能直接free进程指针,需要先释放内部成员再释放结构体本身:

void destroyProcess(process* p) {
    if (p == NULL) return;
    free(p->processName); // 释放main中分配的字符串内存
    // 若processData存在内部动态分配的内存,先调用其对应的销毁函数再释放
    free(p->processData);
    free(p); // 最后释放process结构体本身
}

第二步:出队执行完毕后调用销毁函数

在你的调度逻辑中,当进程执行完成(stepsUntilComplete减到0)需要从队列移除时,调用上述销毁函数释放内存即可,示例参考:

// 调度逻辑示例片段
process* currentProcess = dequeue(ps->foregroundQ);
// 执行当前进程直到运行结束
runProcess(currentProcess);
// 进程不再使用,释放内存
destroyProcess(currentProcess);

第三步:程序退出时兜底释放剩余节点

如果程序退出时还有未执行完成的进程留在队列中,需要遍历foregroundQ和backgroundQ两个队列,将所有剩余节点逐个出队并调用destroyProcess释放,避免出现内存泄漏。

  • 额外注意事项:
    • 不要用静态变量存储process指针,静态变量全局唯一,多次调用入队函数会覆盖之前的地址,既会导致之前的节点内存泄漏,还会出现数据混乱问题。
    • 不要在addNewProcessToSchedule函数内释放process,此时结构体刚存入队列还未被使用,释放后队列会存储野指针,后续访问必然崩溃。

内容的提问来源于stack exchange,提问作者ER89

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:39:03