【释放内存】
本质:标识符放弃对该内存的占有权。
若该内存是栈内存,当所有标识符都放弃,那么系统自动重获占有权。内存依然存在,地址、值都未改变。
若该内存是堆内存,当所有标识符都放弃,不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两次。
【容器内是指针】
标签:作用域,c++,int,内存,new,占有权,delete From: https://www.cnblogs.com/xixixing/p/17852416.html