首页 > 系统相关 >c++本质:释放内存、new与delete、容器内是指针

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

时间:2023-11-23 20:23:01浏览次数:35  
标签:作用域 c++ int 内存 new 占有权 delete

【释放内存】

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

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

若该内存是堆内存,当所有标识符都放弃,不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

相关文章

  • UE4_C++实现TimeLine
    主要实现蓝图节点中时间轴的功能。目前UE提供了两种实现方式,一个是使用FTimeLine其是一个时间轴的结构体;另一种方式是使用UTimeLineComponent,其是一个时间轴组件类。两者内部定义的函数基本一样,组件类中使用这个结构体变量作为类中的成员变量。声明一个时间轴变量/组件FTimeL......
  • ES插入报错 索引只读:blocked by: [FORBIDDEN/12/index read-only / allow delete (ap
     ES插入报错:reason:ElasticsearchException[Elasticsearchexception[type=cluster_block_exception,reason=blockedby:[FORBIDDEN/12/indexread-only/allowdelete(api)];]]   这种大多都是因为磁盘空间不足了超过设置的阈值,一般80%所以索引变成只读了,要把空......
  • C++程序编译常见错误与评测各个状态含义
    编译常见错误提示1.[Error]expected';'before'cout'。在cout前面,缺少一个分号。2.[Error]'b'wasnotdeclaredinthisscope。未定义变量名b。3.[Error]stray'\243'inprogram\stray'\273'inprogram。不可识别的非法字符。4.[Error]ldretu......
  • 引发C++异常的常见原因(一)从报错地址到错误症状
    在进行C++软件开发的过程中,会遇到很多问题,网上差不到,或者查到了也没什么信息可以用,所以这里想到了就将一些常见的问题放在一起,归纳整理一下。本文主要的内容来源于CSDN的大佬文章:https://blog.csdn.net/chenlycly/article/details/125529931,我主要是做个笔记常见问题1.变量未......
  • C++11线程传递参数汇总
    一、概述总结C++11线程传递参数:1.传递基本数据类型(int、double)2.传递字符串3.传递结构体4.传递类对象二、代码示例//导入线程头文件#include<thread>//导入std命名空间usingnamespacestd;//传递int类型的参数voidthreadFu......
  • c++小程序/随机产生100以内的一个自然数,给出7次机会猜测数的大小
    一、随机产生100以内的一个自然数,给出7次机会猜测数的大小要求:1、 如果猜对了,提示:“真聪明,您猜对了!”,并退出程序2、 如果猜得数比随机数大,给出提示“你猜的数太大了”3、 如果猜得数比随机数小,提示“您猜的数太小了”,如果超出七次没有猜对,提示“很遗憾,您没有猜对”,并退出程序......
  • c++小程序/类Date
    声明类Date要求:1、使用户可以设置日期,并在输入错误时提示。a一年12个月,若输入12以外的数,提示“输入月份错误”b每个月依次有{31,28/29,31,30,31,30,31,31,30,31,30,31}若输入的数值超过该月天数,提示“输入天数错误”。2、可以查询两个日期之间相差天数注意:闰年Code#include<iostr......
  • c++小程序/数组排序
    数组排序1、定义交换两个整型数的函数swap2、定义sort函数给数组排序,调用swap函数Code#include<iostream.h>template<classT>voidswap(T&x,T&y){Ttemp;temp=x;x=y;y=temp;}template<classp>voidsort(p*a,pb){for(inti=0;i<10;i++){......
  • c++小程序/输入三个数,判断能不能组成三角形
    输入三个数,判断能不能组成三角形要求:1、输入-1,0,-1,提示“你输入的为负数”2、输入1,2,3,提示“你输入的三个数不能组成三角形”3、输入3,4,5提示“输入的三个数能组成三角形,并且是一个直角三角形”4、输入3,3,4提示“输入的三个数能组成三角形,并且是一个等腰三角形”1、 输入3,3,3提示“输......
  • c++(4)
    C++(4)1.C++模板1.1模板的概论C++提供了函数模板(functiontemplate),函数模板是将函数的参数类型不具体化,在函数使用时,再给定具体的参数的数据类型。C++给定两个模板机制:函数模板和类模板【注】都属于参数类型的模板,又称之为参数模板1.2函数模板函数模板可以自动推......