Windows下平台release debug下内存释放的差异

发布时间 2023-09-04 09:30:10作者: eddygo

今天遇到了这个问题,代码如下:

 

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来析构