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

无为住建设局网站百度指数移动版

无为住建设局网站,百度指数移动版,网站排名掉了怎么办,html5网站后台目录 1. C/C内存分布 2. C语言中动态内存管理方式 3. C内存管理方式 3.1 new/delete操作内置类型 4. operator new与operator delete函数 4.1 连续开辟空间(尽力了解) 5. new和delete的实现原理 5.1 内置类型 5.2 自定义类型 6. 深入理解 6.1malloc/free和new/delete的区…目录 1. C/C内存分布 2. C语言中动态内存管理方式 3. C内存管理方式 3.1 new/delete操作内置类型 4. operator new与operator delete函数 4.1 连续开辟空间(尽力了解) 5. new和delete的实现原理 5.1 内置类型 5.2 自定义类型 6. 深入理解 6.1malloc/free和new/delete的区别 7.内存泄漏 7.1 什么是内存泄漏内存泄漏的危害 7.2 内存泄漏分类了解 7.3 如何检测内存泄漏了解 7.4 避免内存泄漏 1. C/C内存分布 我们可以先来了解一下具体的内存区域分布图通过一个代码 那么我们想为什么要划分这些区域 为了方便管理因为我们在程序中有不同类型的数据(静态局部全局等)比如生命周期的不同放到不同的区域进行管理 哪个是我们重点关注的 堆区。因为其他区域不用管释放申请什么的是由系统自动申请和释放而堆区域是留给用户自己控制的进行申请和释放。用完还回去否则会导致内存泄露 通过代码练习 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] abcd;const char* pChar3 abcd;int* ptr1 (int*)malloc(sizeof(int) * 4);int* ptr2 (int*)calloc(4, sizeof(int));int* ptr3 (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3); }选项: A.栈  B.堆  C.数据段(静态区)  D.代码段(常量区)   globalVar在哪里__c__   staticGlobalVar在哪里__c__   staticVar在哪里___c_   localVar在哪里__a__   num1 在哪里__a__     char2在哪里__a__   *char2在哪里_a__   pChar3在哪里__a__     *pChar3在哪里_d___   ptr1在哪里__a__        *ptr1在哪里_b___ 1. char2代表在常量区有一个字符串abcd/0 去初始化而会在栈上开辟一个数组把这个字符串拷贝过去所以char2和num1是类似的只不过num1是自己开辟的空间而char2的空间由字符串决定 *char2代表取首元素在栈上因为在栈上有自己的字符串在字符数组里2. const修饰的变量不代表一定在常量区他只是常变量pchar3只是栈上的一个指针变量这个指针存了一个地址指向常量区abcd这个字符串所以*pchar3找到的是常量区的a3. 同样ptr1也是栈上的指针他指向堆上的一块空间。所以*ptr1在堆上 字符串常量存储在常量区  2. C语言中动态内存管理方式 主要分为malloc/calloc/realloc/free calloc比malloc多了一步就是初始化为0 realloc为扩容(分为原地和异地扩容)如果空间够的话就原地扩容那么返回的指针跟要扩容的指针是一样的。异地扩容的话会把原来的拷贝后释放原来的空间。 如果内存块足够大realloc会尝试在原地扩大内存块如果无法在原地扩大则会分配新的内存块将原内容复制到新的内存块中并释放原内存块。 例如 int* p2 (int*)calloc(4, sizeof (int)); int* p3 (int*)realloc(p2, sizeof(int)*10); free(p3 ); 3. C内存管理方式 C语言内存管理方式在C中可以继续使用但有些地方就无能为力而且使用起来比较麻烦因 此C又提出了自己的内存管理方式通过new和delete操作符进行动态内存管理。 3.1 new/delete操作内置类型 struct listnode {struct listnode* _pre;struct listnode* _next;int _val;listnode(int val)//所以这里写构造函数不然new不出来:_pre(nullptr),_next(nullptr),_val(val){}}; struct listnode* creatnode(int val) {struct listnode* ret (struct listnode*)malloc(sizeof(struct listnode));if (ret NULL) {perror(malloc fail);return NULL;}ret-_next NULL;ret-_pre NULL;ret-_val val; } int main() {// 动态申请一个int类型的空间int* ptr4 new int;//在堆上要一个int对象// 动态申请一个int类型的空间并初始化为10int* ptr5 new int(10);//在堆上要一个int对象初始化为10// 动态申请10个int类型的空间int* ptr6 new int[3];//要3个int对象int* ptr7 new int[10] {1, 2, 3, 4, 5};//其余未初始化的为0delete ptr4;delete ptr5;delete[] ptr6;//要匹配newp[]就要delete[]//自定义类型 开空间自动调用构造函数listnode* p1 new listnode(1);listnode* p2 new listnode(2);listnode* p3 new listnode(3);return 0; } 可以看出用法上变简介了同时也可以初始化了同时new失败了以后不需要手动检查 注意在申请自定义类型的空间时new会调用构造函数delete会调用析构函数而malloc与 free不会。  相对于c语言的好处 1. 用法上进行调整更简洁好用 2. 对于自定义类型更好的初始化new支持开空间构造函数初始化 4. operator new与operator delete函数 new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是 系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过 operator delete全局函数来释放空间。 operator new是对malloc的封装。operator delete是对free的封装 int* p1 (int*)operator new(10 * 4);//不经常用 int* p2 (int*)new(10 * 4);//不可以这样 可以看出跟malloc一样 可以看出new底层调用operator new 抛异常是在operator new出现的operator new[]就是封装operator new 关于new 1. malloc在调用失败后会返回空但是C是一种面向对象的所以需要进行异常抛出malloc失败后是需要我们自己检查或者我们提前写出一个失败后的检查机制但是operator new 与new 是对malloc的封装它封装的内部具有抛异常的函数 2. 但是operator new 和 malloc的用法一致虽然多了一个检查内部异常但是大部分程序员是不会使用的程序员使用最多的还是new 和 delete  3. 而且new 的内部其实是 operator new 和调用构造函数 而operator new 封装了malloc 和检查异常功能 4. new 的本质是一个操作符它的底层是malloc函数在编译器碰见new时就会自动转化为对应的代码指令 operator new 实际也是通过malloc来申请空间如果 malloc申请空间成功就直接返回否则执行用户提供的空间不足应对措施如果用户提供该措施 就继续申请否则就抛异常。operator delete 最终是通过free来释放空间的。 使用delete是先析构后调用operator delete 4.1 连续开辟空间(尽力了解) class A { public:A(int a0):_a(a){cout A(): this endl;}~A() {cout ~A() this endl;} private:int _a; }; int main() {A* p1 new A[10]; }左边开辟40字节右边开辟44字节 自定义类型使用new连续开辟空间时 所产生的字节数会比我们需要开辟的字节数多这个原因其实是delete的书写格式造成的。  因为delete 释放数组空间的时候是不会在[]内部加上数字的所以需要有一个东西让delete知道要释放多少字节而new []会多次一个字节的空间这个空间就算存放一个数字给予delete进行识别要释放多少字节 当然多开辟空间的问题只是针对于自定义类型而内置类型并不需要多开辟空间但是自定义类型也需要看情况如果自定义类型没有写析构函数而是编译器自动生成的析构函数则也不需要多开辟空间  一定要匹配使用 同时就算有析构函数但按照不匹配的写法那么释放的位置就会出错他少释放了最开始访问数字识别的位置 简单来说有析构函数就会多开辟空间但是不匹配的写法会少释放那个开辟的空间  知道有这么个东西有一定的了解即可就像不需要了解具体的历史只需具备常识  5. new和delete的实现原理 5.1 内置类型 如果申请的是内置类型的空间new和mallocdelete和free基本类似不同的地方是 new/delete申请和释放的是单个元素的空间new[]和delete[]申请的是连续空间而且new在申 请空间失败时会抛异常malloc会返回NULL。 5.2 自定义类型 new的原理 1. 调用operator new函数申请空间 2. 在申请的空间上执行构造函数完成对象的构造 delete的原理 1. 在空间上执行析构函数完成对象中资源的清理工作 2. 调用operator delete函数释放对象的空间 new T[N]的原理 1. 调用operator new[]函数在operator new[]中实际调用operator new函数完成N个对象空间的申请 2. 在申请的空间上执行N次构造函数 delete[]的原理 1. 在释放的对象空间上执行N次析构函数完成N个对象中资源的清理 2. 调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释放空间 6. 深入理解 6.1malloc/free和new/delete的区别 malloc/free和new/delete的共同点是都是从堆上申请空间并且需要用户手动释放。 不同的地方是1. malloc和free是函数new和delete是操作符 2. malloc申请的空间不会初始化new可以初始化 3. malloc申请空间时需要手动计算空间大小并传递new只需在其后跟上空间的类型即可 如果是多个对象[]中指定对象个数即可 4. malloc的返回值为void*, 在使用时必须强转new不需要因为new后跟的是空间的类型 5. malloc申请空间失败时返回的是NULL因此使用时必须判空new不需要但是new需 要捕获异常 6. 申请自定义类型对象时malloc/free只会开辟空间不会调用构造函数与析构函数而new 在申请空间后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成 空间中资源的清理 总结new更方便 7.内存泄漏 7.1 什么是内存泄漏内存泄漏的危害 什么是内存泄漏内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失而是应用程序分配某段内存后因为设计错误失去了对该段内存的控制因而造成了内存的浪费。 内存泄漏的危害长期运行的程序出现内存泄漏影响很大如操作系统、后台服务等等出现内存泄漏会导致响应越来越慢最终卡死。 总结说内存泄漏一块已经不再使用的空间没有释放不让别人用(占着茅坑不拉屎)  void MemoryLeaks() {// 1.内存申请了忘记释放int* p1 (int*)malloc(sizeof(int));int* p2 new int;// 2.异常安全问题int* p3 new int[10];Func(); // 这里Func函数抛异常导致 delete[] p3未执行p3没被释放.delete[] p3; } 7.2 内存泄漏分类了解 C/C程序中一般我们关心两种方面的内存泄漏 堆内存泄漏(Heap leak) 堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一 块内存用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放那么以后这部分空间将无法再被使用就会产生Heap Leak。 系统资源泄漏指程序使用系统分配的资源比方套接字、文件描述符、管道等没有使用对应的函数释放掉导致系统资源的浪费严重可导致系统效能减少系统执行不稳定。 7.3 如何检测内存泄漏了解 在vs下可以使用windows操作系统提供的_CrtDumpMemoryLeaks() 函数进行简单检测该 函数只报出了大概泄漏了多少个字节没有其他更准确的位置信息。 int main() {int* p new int[10];// 将该函数放在main函数之后每次程序退出的时候就会检测是否存在内存泄漏_CrtDumpMemoryLeaks();return 0; }// 程序退出后在输出窗口中可以检测到泄漏了多少字节但是没有具体的位置 Detected memory leaks! Dumping objects - {79} normal block at 0x00EC5FB8, 40 bytes long. Data: CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete. 因此写代码时一定要小心尤其是动态内存操作时一定要记着释放。但有些情况下总是防不胜防简单的可以采用上述方式快速定位下。如果工程比较大内存泄漏位置比较多不太好查时一般都是借助第三方内存泄漏检测工具处理的。 7.4 避免内存泄漏(了解) 1. 工程前期良好的设计规范养成良好的编码规范申请的内存空间记得匹配的去释放。ps这个理想状态。但是如果碰上异常时就算注意释放了还是可能会出问题。需要下一条智能指针来管理才有保证。 2. 采用RAII思想或者智能指针来管理资源。 3. 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。 4. 出问题了使用内存泄漏工具检测。ps不过很多工具都不够靠谱或者收费昂贵。 由于知识有限可能部分知识没讲详细请理解
http://www.pierceye.com/news/46694/

相关文章:

  • 厦门市建设协会网站首页昆明做网站优化
  • 设计公司做网站价格培训机构出来的前端好找工作吗
  • php网站制作工具网站开发外包计入什么科目
  • 广州洲聚网站开发简单的网站开发工具
  • 云网站建设的意义php框架做网站
  • 阿里巴巴国际站下载电脑版沈阳短视频制作公司
  • 做全房订制网站公司网站开发公司会计
  • wordpress海外建站网站建设模板怎么做
  • 商务网站建设个人总结html基本结构代码
  • 营销型企业网站策划方案贵州做团队培训的网站
  • 淘宝网站的建设目的是什么意思wordpress的cute主题破解版
  • 重庆云诚度网站建设网站建设的现状
  • 东莞网站忧化微信小程序推广
  • 安福县住房和城乡建设局网站wordpress网代码显示图片
  • 网站开发可选择的方案有电子商务网站建设的市场分析
  • 百度站长平台工具门户网站建设实施方案
  • 重庆网站建设网页设计国外的创意设计网站
  • wordpress改成自己网站企业网站建设推广
  • 建立免费公司网站淮北网络推广
  • 公司网站名词解释什么是门户
  • 有了域名之后怎么做网站网站开发主要用到哪些工具
  • 四川城乡建设厅官方网站网站图片怎么做优化
  • 合肥网站建设方案咨询什么是电子商务公司
  • mooc网站开发流程图网页设计师一个月多少钱
  • 餐厅网站建设什么网站开发计算机语言的比较
  • 山东建设和城乡建设厅注册中心网站首页展示型网站功能
  • 网站开发工具需求几年做啥网站能致富
  • 建手机网站怎么收费织梦唯美网站源码
  • 网站开发流程分析可视化域名网站模块被删了
  • 做物流网站计划0基础网站建设教程