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

多层指针嵌套向量的内存释放错误排查求助

内存释放代码的错误分析

内存分配流程

  1. 动态分配对象:
Object* someObject = new Object();
  1. 将指针的地址插入vector:
std::vector<Object**> someVector0;
someVector0.push_back(&someObject);
  1. 将someVector0中存储的地址的地址插入另一个vector:
std::vector<Object***> someVector1;
someVector1.push_back(&someVector0[0]);
  1. 将someVector1的地址插入第三个vector:
std::vector<std::vector<Object***>*> someVector2;
someVector2.push_back(&someVector1);

你的释放代码

for (int i = 0; i < someVector2.size(); i++) {
    for (int j = 0; j < (*someVector2[i]).size(); j++) {
        delete *(*(*someVector2[i])[j]);
        delete *(*someVector2[i])[j];
        delete (*someVector2[i])[j];
    }
    delete someVector2[i];
}

错误分析

这段释放代码存在多处致命错误:

  • 错误1:尝试释放栈内存
    someObject是栈上的指针变量,&someObject是栈地址。你代码里的delete *(*someVector2[i])[j];等同于delete &someObject,这是试图释放栈上的变量,属于未定义行为,直接导致程序崩溃。
    同理,someVector0是栈上的vector,&someVector0[0]是栈上的元素地址,delete (*someVector2[i])[j];就是释放这块栈内存,完全错误。
  • 错误2:释放栈上的vector对象
    someVector1是栈上创建的vector,&someVector1是栈地址,delete someVector2[i];试图释放栈上的vector,同样是未定义行为。

正确的释放逻辑

只有new Object()分配的是堆内存,其他所有变量(包括各个指针、vector)都是栈上的,绝对不能用delete释放栈内存。正确的释放代码只需要释放堆上的Object:

// 通过多层指针找到堆对象并释放
delete *(*(*someVector2[0])[0]);
// 如果还能直接访问someObject,更简单的写法:
// delete someObject;

补充说明

这种多层指针嵌套的写法极度不合理,完全不具备可维护性,强烈建议使用智能指针管理内存,彻底规避手动内存管理的风险;如果必须手动管理,一定要严格区分栈内存和堆内存,仅对new分配的堆对象执行delete。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:52:55