多层指针嵌套向量的内存释放错误排查求助
内存释放代码的错误分析
内存分配流程
- 动态分配对象:
Object* someObject = new Object();
- 将指针的地址插入vector:
std::vector<Object**> someVector0; someVector0.push_back(&someObject);
- 将someVector0中存储的地址的地址插入另一个vector:
std::vector<Object***> someVector1; someVector1.push_back(&someVector0[0]);
- 将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
相关产品推荐
相关产品推荐

