今天遇到了这个问题,代码如下:
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来析构
标签:Windows,int,内存,析构,debug,release,bodys From: https://www.cnblogs.com/eddygo/p/17676078.html