c++本质:释放内存、new与delete、容器内是指针

发布时间 2023-11-23 20:36:48作者: 夕西行

【释放内存】

本质:标识符放弃对该内存的占有权

若该内存是栈内存,当所有标识符都放弃那么系统自动重获占有权。内存依然存在,地址、值都未改变。

若该内存是堆内存,当所有标识符都放弃,不delete,那么系统也无法拥有占有权。所以delete让系统重获占有权。内存依然存在,地址未变、值变为默认值。

下述案例,来理解“释放内存”

int* p = nullptr;
{
    int x = 10;
    p = &x;
}
cout << *p << endl;    //10

x已经超出作用域被释放,那么p为什么不是野指针,而正确输出了值?

VS打断点后Debug运行后,VS中调试——窗口——内存,查看地址和对应的值。

 x超出作用域后,地址、值都完好无损。与我们理解的释放内存不一样啊,fuck~~~

 当x超出作用域,x放弃占有权,但p依然占有。若p也超出作用域,放弃占有权,则系统重获占有权。

【new与delete】

本质:new在堆上申请内存,标识符对该堆内存具有占有权。delete交还占有权给系统。内存依然存在,值会变为默认值。

也就是说如果不delete,这块内存系统无权再安排给其他使用,浪费资源。

下述案例,来理解new与delete

int* p = nullptr;
{
    int* x = new int(10);    //堆内存
    p = x;
    //delete x;
    //x = nullptr;
}
//delete p;
//p = nullptr;

在作用域内,delete x或p都可以,但是不可以delete两次。

【容器内是指针】