ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

课时5:范围for、动态内存分配、nullptr

2020-01-16 21:56:49  阅读:245  来源: 互联网

标签:malloc int nullptr 课时 free 动态内存 new NULL 分配


1.范围for
int arr1(){1,2,3,4,5,6,7};
for(auto x:arr1)
cout<<x<<endl;

int arr2(){2,2,3,1,3,4,2}
for(auto &x:arr2)
cout<<x<<endl;


2.动态内存分配问题
C++中,把内存详细分为5个区域:
栈:函数内的局部变量会放在这里,由编译器自动分配和释放
堆:程序员用malloc\new来分配,用free\delete来释放,忘记释放后,系统会回收
全局、静态变量存储区:放全局变量和静态变量static,程序结束时系统释放
常量存储区:
程序代码区:

//堆和栈的用途和区别
栈:空间是有限的,分配速度快
堆:只要不超出实际拥有的物理内存,也在操作系统允许能够分配的最大内存大小之内,都可以分配
分配速度比栈慢,可以随时使用malloc\new来分配,使用free\delete来释放,非常灵活。

//malloc和free:malloc和free用来从堆中分配和释放内存用。malloc和free()是函数
//malloc(memory allocation):动态内存分配

//一般形式:
void *malloc(int NumBytes)://NumBytes:要分配的字节数,分配成功则返回指向指向被分配内存的指针,分配失败则返回NULL
//free:
void free(void *FirstByte):将之前用malloc分配的内存空间还给程序(操作系统),也就是说释放了这块内存。这块内存被系统回收,并在需要的时候有序通分配出去

int *p =NULL;
p = malloc(sizeof(int)); //在堆中分配4个字节
if(p!=NULL){
//分配成功
*p = 5;
cout<<*p<<endl;
free(p); //释放堆内存
}

char *point = NULL;
point = (char *)malloc(100 * sizeof(char))
if(point != NULL)
{
strcpy_s(point,100,"hello,world"); //strcpy_s函数: 字符串拷贝
cout<<point<<endl;
}

-----------------------------------

int *p = (int *)malloc(100*sizeof(int)); //先分配一块区域,然后用指针去使用这一块空间
if(p != NULL){

int *q = p;
*q++ = 1;
*q++ = 5;
cout<<*p<<endl;
cout<<*(p+1)<<endl;
free(p);

}

------------------------------------
//new和delete:是运算符(标识符),C++中用new和delete来分配和释放内存,不再使用malloc和free来分配和释放内存
//new,delete比malloc,free更强大
new一般使用格式:
指针变量名 = new 类型标识符
指针类型名 = new 类型标识符(初始值);
指针类型名 = new 类型标识符[内存单元个数];

int *myint = new int; //
if(myint !=NULL){

*myint = 8;
cout<<*myint<<endl;
delete myint; //释放单个myint的空间

}

-------------------------------
int *p = new int(18);
cout<<*p<<endl;
delete p;
-------------------------------
int *pa = new int[100];
if(pa != NULL){

int *pb = pa;
*pb++ = 10;
*pb++ = 20;
cout<<*pa<<endl;
cout<<*(pa+1)<<endl;

}

3.nullptr:代表的是空指针,C++11引入的新关键字,为了避免整数和指针混淆

char *p = NULL; //NULL实际是0
char *q = nullptr;
char *p = nullptr;

if(p == nullptr){
cout<<"nullptr==NULL"<<endl;
}

//比较NULL和nullptr
typeid(NULL).name()
typeid(nullptr).name()
结论:对于指针的初始化,以往用到的和指针有关的NULL的场合,全部使用nullpotr代替

标签:malloc,int,nullptr,课时,free,动态内存,new,NULL,分配
来源: https://www.cnblogs.com/cy2837/p/12203392.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有