cc笔试题——C中newdelete概念和用法总结_第1页
cc笔试题——C中newdelete概念和用法总结_第2页
cc笔试题——C中newdelete概念和用法总结_第3页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、cc+笔试题 C+ 中 newdelete 概念和用法总结学过 C+ 的程序员都知道, new/delete 是其管理内存的主要方法。与 C 语言相比, C+ 支持面向对象技术,因此在内存管理方面有所区别。在 C+ 中,数据对象(基本类型和复合类型)的创建包括两个部分:一是给数据对象分配足够的内存,二是内存进行数据的初始化。而 C 中,只有第一个分配内存的作用。并且,不仅仅是类,其它基本类型,如 int 型等,也是如此。例如:char* pc1 = new char;char* pc2 = new char('A');以上两条语句都能够给对应的指针分配内存,不同在于,第一条语句

2、仅仅分配内存,而具体的内容是随机的;而第二条语句不仅分配内存,并且赋值为A 。相对应的,当不再需要这些内存时候,可以采用delete 来释放内存。C+ 中,关于 new/delete 相关的内容很多,初学者比较容易混淆概念。以下是笔者的一点总结,希望对那些还处于懵懵懂懂的程序员有帮助。1. new/delete 关键字。 C+ 和其它语言一样,也事先预留了一些单词作为系统使用。程序员是不能用这些单词来表示自己的数据的。如int, float, struct , class等。当然 new/delete 也是。但是new/delete 关键字仅仅是在词法上的定义,它只表明程序员不能重复定义它们,

3、用来表达其它含义。2. new/delete 表达式。指的是 new/delete 与其它单词所组成的一条有具体词义的语句(运算符形式 )。如new char;就是分配大小为一个byte 的内存空间。 在 C+ 中,new/delete表达式在不同的情况下,有不同的实现途径。但是实现的功能都是一样的,就是处理内存相关操作。3. operator new 和 operator delete函数。这点很奇怪,在C+ 中,某些运算符号可以重载为函数来使用(尽管运算本身就是一种抽象的对数据处理的函数方式),因此 operator new 和operator delete 是两个函数名称。但是这两种函数

4、只是,分配内存而不初始化。这点与C 语言的 malloc 和 free 比较类似。4. 类成员函数 new/delete。指的是类的成员函数,并且函数名是 new 和 delete。这与 3. 中的函数有点类似, 只是3.中的函数是标准空间中的函数,而类成员函数是类本身的成员函数。接下来,是这4 条之间的关系。1. 只是说明new/delete 两个单词程序员不能再定义使用,与具体的功能毫无关系。 2.是一条与实际条件相关的,具有内存分配功能的表达式。3.4 是函数名,只是作用的空间大小不一样。简单说来就是:单词,表达式,函数名和 函数名。当 C+ 编译器碰到 new/delete 表达式的时

5、候,它会去寻找相关的内存处理方式。如果表达式的对象并没有定义自己的成员new 函数,那么它就会去调用全局的 new 函数去分配内存; 反之则调用成员函数的 new 函数去分配内存。接着根据参数的不同,去调用相应的初始化函数,也就是构造函数。也就是说new 表达式会执行两个步骤:分配内存和初始化。在分配内存的阶段,new 表达式会有2 种分配方式:全局的operator new或者是自定义的 new 成员函数。 而初始化工作是调用构造函数来完成的。 delete 表达式功能和次序刚好相反,但是还是同意的机制。这就是 new/delete 相关几个概念的区别。一般地,不要去修改全局的 operat

6、ornew/ operator delete 函数,但是根据需要, 可以定义类的相应的成员函数来改变内存分配的方式。关于 new 还单有一种功能(其实也是new 的一种重载方式,但不进行分配内存操作,只是返回原来的内存地址),就是在指定的内存空间上创建一个对象,用法如下:char buff20;CNone* pNone = new (buff) CNone();假设 CNone 的大小不超过20 个字节,那么就在buff 开头的内存上,初始化一个对象。接着就可以通过pNone来进行操作。释放的方法如下:pNone->CNone();那么类 pNone 对象就会被释放, 但是内存

7、buff 并没有释放,依旧存在。重载 new/delete 的原则是: 尽量不要重载 (很矛盾啊),除非完全清楚具体的分配情况。如果要重载,那么要实行配对法则。就是有 new 的重载,必须有其对应的 delete 重载,尽管有时候 delete 并不会进行内存的释放。常见的重载函数形式有(参考<new> ):void*operator new (size_t size) throw(std:bad_alloc);voidoperator delete (void* addr) throw();void*operator new (size_t size)throw(

8、std:bad_alloc);voidvoid*operator delete (void* addr) throw(); operator new (size_t size, nothrow_t &n)throw();voidoperator delete (void* addr, nothrow_t &n)throw();void*operator new (size_t size,void* p) throw() return p;voidoperator delete (void* addr, void* p) throw() 除了最后一组外,其它组的内存分配就根据实际情况来实现。注意,对于size 数值为 0 的情况,要在内部实现为1。这是因为 C+ 标准要求空对象也要有实际的意义。但是重载模式并不限于以上几组,原则上重载的 new/delete 组对有无数对,但是和实际相关的就只有那么几组而已。要注意的是,所有 new/delete 成对出现,但并不是代表用带参数的 new 创建的对象,在销毁的时候同样使用相同参数的delete 去销毁,实际上是用标准的de

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论