Windows下平台release debug下内存释放的差异
今天遇到了这个问题,代码如下:
int test1(int* n, int**const bodys)
{
if (n == nullptr || bodys == nullptr)
{
return -1;
}
*n = 3;
std::vector<int >nums= {1, 2, 3};
*bodys = &nums[0];
return 0;
}
int main(void)
{
int n = 0;
int *bodys=NULL;
test1(&n,&bodys);
int d = *bodys++;
return 0;
}
vector是个局部变量,函数输出了他的地址,按照道理,函数结束之后,地址就失效了。但是在外面居然可以正常访问这个地址(release下),值是对的,没有析构,我验证了之后发现debug下,发现值是正常析构的。
所以我合理怀疑,release下编译器做了优化,它只把内存还给了操作系统,但是并没有对vector的每个元素执行析构,所以值还是有效的,但是下次再分配这段内存已经被标记成未使用了,所以还会分配到,所以这个地址指向的值是不靠谱的。
给我两个启示
1调试代码多用debug ,release 隐藏了许多问题
2写函数的时候很多用到二级指针,再函数内部要用new来分配内存,函数调用者负责析构,调用delete来析构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix