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

上海知名网站推广android 移动网站开发详解

上海知名网站推广,android 移动网站开发详解,wap网站分享到微信,百度seo优化服务https://blog.csdn.net/happyxieqiang/article/details/50775847 0. 属性 new/delete是C关键字#xff0c;需要编译器支持。malloc/free是库函数#xff0c;需要头文件支持。 1. 参数 使用new操作符申请内存分配时无须指定内存块的大小#xff0c;编译器会根据类…https://blog.csdn.net/happyxieqiang/article/details/50775847   0.       属性 new/delete是C关键字需要编译器支持。malloc/free是库函数需要头文件支持。 1.       参数 使用new操作符申请内存分配时无须指定内存块的大小编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。 2.       返回类型 new操作符内存分配成功时返回的是对象类型的指针类型严格与对象匹配无须进行类型转换故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * 需要通过强制类型转换将void*指针转换成我们需要的类型。 3.       分配失败 new内存分配失败时会抛出bac_alloc异常。malloc分配内存失败时返回NULL。 4.      自定义类型          new会先调用operator new函数申请足够的内存通常底层使用malloc实现。然后调用类型的构造函数初始化成员变量最后返回自定义类型指针。delete先调用析构函数然后调用operator delete函数释放内存通常底层使用free实现。          malloc/free是库函数只能动态的申请和释放内存无法强制要求其做自定义类型对象构造和析构工作。 5.      重载 C允许重载new/delete操作符特别的布局new的就不需要为对象分配内存而是指定了一个地址作为内存起始区域new在这段内存上为对象调用构造函数完成初始化工作并返回此地址。而malloc不允许重载。 6.       内存区域 new操作符从自由存储区free store上为对象动态分配内存空间而malloc函数从堆上动态分配内存。自由存储区是C基于new操作符的一个抽象概念凡是通过new操作符进行内存申请该内存即为自由存储区。而堆是操作系统中的术语是操作系统所维护的一块特殊内存用于程序的内存动态分配C语言使用malloc从堆上分配内存使用free释放已分配的对应内存。自由存储区不等于堆如上所述布局new就可以不位于堆中。     今天偶然看到一个面试经验中提到malloc和new的区别突然发现自己虽然两个都用过但是至于区别真的不是很明白 所以就仔细查了一些资料算是对这个点彻底地了解一下现在把我所学到的记录下来。 malloc与free是C/C语言的标准库函数new/delete是C的运算符。它们都可用于申请动态内存和释放内存。 1.malloc函数初探 首先我们要知道malloc是一个函数malloc的全称是memory allocation中文叫动态内存分配。它的原型是 void *malloc(int size); 1说明malloc 向系统申请分配指定size个字节的内存空间返回类型是 void* 类型。void* 表示未确定类型的指针。C,C规定void* 类型可以强制转换为任何其它类型的指针。    在这里注意 (1) void* 表示未确定类型的指针更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据比如是char还是int或者… (2) 使用malloc向系统申请内存时可能分配失败。如果分配失败则返回一个空指针NULL。关于分配失败的原因有很多种比如说空间不足就是一种。 一个对应的释放内存的函数 void free(void *FirstByte); 1该函数是将之前用malloc分配的空间还给程序或者是操作系统也就是释放了这块内存让它重新得到自由。 至于用法其实这两个函数用起来倒不是很难也就是malloc()之后觉得不用了需要释放把它给free()了举个简单例子 char *Ptr NULL; Ptr (char *)malloc(100 * sizeof(char)); if (NULL Ptr){ exit (1); } gets(Ptr); free(Ptr); Ptr NULL; 12345678当然具体情况要具体分析以及具体解决。比如说你定义了一个指针在一个函数里申请了一块内存然后通过函数返回传递给这个指针那么也许释放这块内存这项工作就应该留给其他函数了。只要保证每个malloc之后必须有一个free与之对应。 关于这个函数的用法需要注意的一些地方 1.申请了内存空间后必须检查是否分配成功。 2.当不需要再使用申请的内存时记得释放释放后应该把指向这块内存的指针指向NULL防止程序后面不小心使用了它。 3.这两个函数应该是配对。如果申请后不释放就是内存泄露如果无故释放那就是什么也没有做。释放只能一次如果释放两次及两次以上会出现错误释放空指针例外释放空指针其实也等于啥也没做所以释放空指针释放多少次都没有问题。 4.虽然malloc()函数的类型是void*,任何类型的指针都可以转换成void*,但是最好还是在前面进行强制类型转换因为这样可以躲过一些编译器的检查。 2.malloc函数深入 看了以上的内容我们大致知道malloc函数的初步内容以及它的用法但是我们不知道malloc函数是怎么实现动态分配内存的。那它是怎么动态分配内存的呢 答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时就会遍历该链表然后就寻找第一个空间大于所申请空间的堆结点然后就将该结点从空闲结点链表中删除并将该结点的空间分配给程序。 说到这里就不得不提堆什么是堆呢堆是大家共有的空间分全局堆和局部堆。全局堆就是所有没有分配的空间局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配运行过程中也可以向系统要额外的堆记住一点从堆申请的内存用完了要还给操作系统也就是释放如果不还的话会发生内存泄露。 而所谓内存泄露就好比你去食堂吃饭你吃完了之后没把盘子拿走这在别人看来是这个座有人占了可怕的是你回头吃饭又占了一个新座你吃完之后还是没把盘子拿走……终于整个食堂的座位都被占满了食堂也乱套了。比喻不太恰当但大致是这个意思 平常我们老说堆栈、堆栈那栈又是什么呢栈是线程独有的保存其运行状态和局部自动变量的。栈在线程开始的时候初始化每个线程的栈互相独立。每个函数都有自己的栈栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。 通过上面对概念的描述可以知道 栈是由编译器自动分配释放存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。 堆一般由程序员分配释放若不释放程序结束时可能由操作系统回收。注意这里说是可能并非一定。所以堆一定要释放 3.new运算符 3.1 C中用new和delete动态创建和释放数组或单个对象。 动态创建对象时只需指定其数据类型而不必为该对象命名new表达式返回指向该新创建对象的指针我们可以通过指针来访问此对象。 int *pinew int; 1这个new表达式在堆区中分配创建了一个整型对象并返回此对象的地址并用该地址初始化指针pi 。 3.2 动态创建对象的初始化 动态创建的对象可以用初始化变量的方式初始化。 int *pinew int(100); //指针pi所指向的对象初始化为100 string *psnew string(10,9);//*ps 为“9999999999” 12如果不提供显示初始化对于类类型用该类的默认构造函数初始化而内置类型的对象则无初始化。 也可以对动态创建的对象做值初始化 int *pinew int( );//初始化为0 int *pinew int;//pi 指向一个没有初始化的int string *psnew string( );//初始化为空字符串 对于提供了默认构造函数的类类型没有必要对其对象进行值初始化 1233.3 撤销动态创建的对象 delete表达式释放指针指向的地址空间。 delete pi ;// 释放单个对象 delete [ ]pi;//释放数组 12如果指针指向的不是new分配的内存地址则使用delete是不合法的。 3.4 在delete之后重设指针的值 delete p; 1执行完该语句后p变成了不确定的指针在很多机器上尽管p值没有明确定义但仍然存放了它之前所指对象的地址然后p所指向的内存已经被释放了所以p不再有效。此时该指针变成了悬垂指针悬垂指针指向曾经存放对象的内存但该对象已经不存在了。悬垂指针往往导致程序错误而且很难检测出来。 一旦删除了指针所指的对象立即将指针置为0这样就非常清楚的指明指针不再指向任何对象。零值指针int *ip0; 3.5 区分零值指针和NULL指针 零值指针是值是0的指针可以是任何一种指针类型可以是通用变体类型void*也可以是char*int*等等。 空指针其实空指针只是一种编程概念就如一个容器可能有空和非空两种基本状态而在非空时可能里面存储了一个数值是0因此空指针是人为认为的指针不提供任何地址讯息。 4.malloc和new的区别 1 new 返回指定类型的指针并且可以自动计算所需要大小。而 malloc 则必须要由我们计算字节数并且在返回后强行转换为实际类型的指针。 例 //new int *p;    p new int; //返回类型为int* 类型(整数型指针)分配大小为 sizeof(int); int* parr;    parr new int [100]; //返回类型为 int* 类型(整数型指针)分配大小为sizeof(int) * 100; //malloc int* p;    p (int *) malloc (sizeof(int)*128);//分配128个可根据实际需要替换该数值整型存储单元并将这128个连续的整型存储单元的首地址存储到指针变量p中 double *pd(double *) malloc (sizeof(double)*12);//分配12个double型存储单元并将首地址存储到指针变量pd中 123456789102 malloc 只管分配内存并不能对所得的内存进行初始化所以得到的一片新内存中其值将是随机的。new创建的对象可以用初始化变量的方式初始化。 除了分配及最后释放的方法不一样以外通过malloc或new得到指针在其它操作上保持一致。转载于:https://www.cnblogs.com/diegodu/p/9190717.html
http://www.zqtcl.cn/news/854049/

相关文章:

  • 培训班管理系统 免费太原优化网站排名
  • 上海怎么做网站网站让图片充满屏幕怎么做
  • 哈尔滨营销网站建设wordpress 加载图片不显示
  • 电商网站功能结构图网站做中秋专题怎么弄
  • 深圳专业建站平台陕西省建设工程质量安全监督总站网站
  • 制作网页的网站的软件是用户反馈数据分析软件园
  • 南京 做网站seo查询网站
  • 卖高仿名牌手表网站共享wifi小程序搭建
  • c#网站开发模板想在意大利做购物网站
  • 2015做那些网站能致富60天做网站
  • 沈阳个人建站模板网站图片计时器怎么做
  • 福州定制网站开发北京排名seo
  • 地方门户网站开发方案长沙有哪个学校可以学网站建设
  • 建个购物网站水果建设网站前的市场分析
  • 建网站的目的小程序登录代码
  • 南京有名的网站建设公司自学室内装修设计教程
  • 新乡市做网站的公司开发公司简介企业介绍
  • 礼品网站模板淘宝店铺购买交易平台
  • 属于公司的网站怎么做外贸服装网站开发
  • 做暧网站泸州公司做网站
  • 做文库类网站网站所有权 备案
  • 网站开发主要内容站长之家网站查询
  • 网站推广优化排名公司wordpress添加说说
  • 维护一个网站要多少钱企业怎么做网站
  • 怎么做兼职网站成都必去十大网红景点
  • 网站建设如何传视频教程电脑网站设计公司
  • 网站开发培训教程制作网站开发公司
  • 网站前端做报名框代码seo教育培训机构
  • 做网站要学习什么分销网站
  • 镇江市住房和城乡建设局网站常州建设网站