当前位置: 首页 > wzjs >正文

免费网站推广咱们做衡水做淘宝网站建设

免费网站推广咱们做,衡水做淘宝网站建设,天津市工程建设信息系统,网站开发实习个人小结目录 1.C/C中的内存 2.C内存管理 2.1C语言内存管理 2.2new和delete 2.2.1概念及定义 2.2.2自定义类型内存管理 2.2.3 delete与delete[ ] 1.C/C中的内存 在C/C中编译器会对不同的代码进行内存分配,给代码的内存区主要分为栈区、堆区、数据段(静态区)、代码段(…

目录

1.C/C++中的内存

2.C++内存管理

2.1C语言内存管理

2.2new和delete

2.2.1概念及定义

 2.2.2自定义类型内存管理

2.2.3 delete与delete[ ]


1.C/C++中的内存

在C/C++中编译器会对不同的代码进行内存分配,给代码的内存区主要分为栈区、堆区、数据段(静态区)、代码段(常量区)。像常见的局部变量就分配在栈区,具体内存分区如图所示:

说明:

(1)又叫堆栈,主要储存非静态局部变量、函数参数、返回值等,且向下增长

(2)主要用于程序运行时动态分配内存,是向上增长的

(3)数据段主要储存全局数据(变量),静态数据(变量)

(4)代码段主要储存可执行代码、只读数据(数据)。

对于栈和堆的向下、向上调整:C/C++中的内存分区从代码段到栈是从低地址到高地址,向下增长的意思是使用栈时优先使用高地址内存,由高到低;向上增长的意思是有限使用低内存地址,由低到高。以代码为例:

#include<iostream>using namespace std;int main()
{int x = 0;int y = 0;int* a = (int*)malloc(sizeof(int));int* b = (int*)malloc(sizeof(int));cout << "x:" << &x << endl;cout << "y:" << &y << endl;cout << endl;cout << "a:" << a << endl;cout << "b:" << b << endl;return 0;
}

运行结果如下(VS2022 x86 Debug环境): 

可以看到在栈开辟的局部变量x,y:x比y先定义,x的地址也比y的地址大;对于在堆区开辟的a,b:a比b先开辟,a地址也比b小。但堆区不一定全是向上增长,为提高堆的利用效率,当开辟空间较小时可能会在之前的未使用的空间进行开辟。

2.C++内存管理

2.1C语言内存管理

C语言中利用malloc/calloc/realloc动态管理内存:

(1)malloc快速分配指定大小的内存,不进行初始化

void* malloc (size_t size);

(2)calloc既分配内存又进行初始化

void* calloc (size_t num, size_t size);

(3)realloc对指定位置内存进行再分配

void* realloc (void* ptr, size_t size);

2.2new和delete

2.2.1概念及定义

new和delete是C++中用于动态管理内存的运算符,new用于给对象开辟空间,delete用于销毁对象空间,具体语法定义如下(以内置类型为例):

#include<iostream>using namespace std;void test1()
{//管理对象int* ptr4 = new int;int* ptr5 = new int(3);delete ptr4;delete ptr5;//管理对象数组int* ptr6 = new int[3];delete[] ptr6;
}int main()
{test1;return 0;
}

具体分析如下: 

 2.2.2自定义类型内存管理

既然new和delete与C中动态内存管理差不多,那为什么还要设计这两个运算符呢?C++中引入了自定义类型,为自定义类型开辟空间也算实例化的一种,但使用malloc等函数无法在开辟内存时调用构造初始化,所以在C++中引入new和delete来动态管理自定义类型空间。

new和delete更抽象的来说更像一种运算符重载,new将开辟空间与调用构造封装在一起,而delete则将空间销毁与析构封装在一起。下面以Stack为例进一步理解:

#include<iostream>using namespace std;template<class T>
class Stack
{
public:Stack(int n = 4):_arr(new T[n]),_size(0),_capacity(0){cout << "Stack(int)" << endl;}~Stack(){if (_size != 0){free(_arr);_arr = nullptr;_size = _capacity = 0;cout << "~Stack()" << endl;}}void Push(T x){_arr[_size] = x;++_size;}private:T* _arr;int _size;int _capacity;
};void test2()
{Stack<int>* s1 = new Stack<int>;(*s1).Push(1);(*s1).Push(2);(*s1).Push(3);delete s1;
}int main()
{test2();return 0;
}

下面利用图解理解:

遇见对象中再开空间的情况:new会优先给对象开空间,然后调用构造函数给对象成员初始化;delete销毁时会优先调用析构函数销毁对象中的资源,随后再销毁对象。

2.2.3 delete与delete[ ]

在C++中new与new[ ],delete与delete[ ]有着不同重载。其中一方面是new[ ]与delete[ ]要开辟多次空间以及调用多次对象构造与析构,实现方法不同;另一方面new[ ]会在开辟所需内存外,另外留出部分空间来记录所开辟的大小参数,方便delete[ ]来正确销毁空间大小,相应的delete[ ]会从记录空间销毁,而delete则是直接从指针起始位置开始销毁。

所以这里new与delete,new[ ]与delete[ ]要匹配使用。

http://www.dtcms.com/wzjs/594152.html

相关文章:

  • ppt怎么做 pc下载网站个人logo创意设计免费
  • 宿州城市建设投资网站网站建设包括哪几个方面
  • 专注吴中网站建设推广交互设计和ui设计的区别
  • 报价网站建设网站建设市场分析
  • 网站不被收录的原因花卉电子商务网站建设策划书
  • 微信表情包制作网站源码网站程序
  • 南京高端网站设计网站开发公司业务员培训
  • 和黑人做网站竞彩网站开发
  • 上海市住房和城乡建设部网站官网电影网站怎么建设
  • 代网站备案费用成都idc机房托管
  • 2002年网站建设公司上虞建设局网站
  • 做哪个行业的网站好深圳网站建设公司业务招聘
  • 个人网站 做导航济南市建设信用网站
  • 为公司做的图可以上传网站吗泰州网站建设公司哪家专业
  • 英文网站建设服务合同模板下载布局网站建设
  • 免费软件下载官方网站wordpress网站好做排名吗
  • 沈阳做企业网站哪家好河南省新闻出版学校咋样
  • 汕头企业自助建站青海住房和城乡建设部网站
  • 手机商城网站制作专门做画册的网站
  • 体育网站开发的目的上海网站建设外包
  • 响应式网站模板 食品福田欧曼卡车
  • 一个网站建设需要什么牡丹区住房和城乡建设局网站
  • 个人网站备案类型网站建设费用如何收取
  • 品牌网站建设的作用网站做线
  • 芜湖做网站找哪家好怎么自己网站搜不到了
  • 网络公司网站报价方案wordpress文章类插件
  • 公司建设个网站一点空间网站建设
  • 百度公司网站制作个人网站制作 教程
  • 网站备案后可以更换域名吗做网站互联网公司有哪些
  • 中装建设官方网站网站的建设 想法