cc笔试题C中newdelete概念和用法总结.docVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
学过C++的程序员都知道,new/delete是其管理内存的 主要方法。与C语言相比,C++支持面向对象技术,因此在 内存管理方面有所区别。 在C++中,数据对象(基本类型和复合类型)的创建包括两 个部分:一是给数据对象分配足够的内存,二是内存进行数 据的初始化。而C中,只有第一个分配内存的作用。并且 不仅仅是类,其它基本类型,如int 不仅仅是类,其它基本类型,如 int型等,也是如此。例如 char* pel = new char; char* pc2 = new char(A) 以上两条语句都能够给对应的指针分配内存,不同在于,第 一条语句仅仅分配内存,而具体的内容是随机的;而第二条 语句不仅分配内存,并且赋值为‘ A’。相对应的,当不再需 要这些内存时候,可以采用delete 要这些内存时候,可以采用 delete来释放内存 C++中,关于new/delete相关的内容很多,初学者比较容易 混淆概念。以下是笔者的一点总结,希望对那些还处于懵懵 懂懂的程序员有帮助。 1. new/delete关键字。C++和其它语言一样,也事先 预留了一些单词作为系统使用。程序员是不能用这些单词来 表示自己的数据的。如int ,float, struct, class 等。当然new/delete也是。但是new/delete关键字仅仅是在 词法上的定义,它只表明程序员不能重复定义它们,用来表 达其它含义。 2. new/delete表达式。指的是new/delete与其它单词所 组成的一条有具体词义的语句(运算符形式)。如new char; 就是分配大小为一个 byte的内存空间。在C++中,new/delete 表达式在不同的情况下,有不同的实现途径。但是实现的功 能都是一样的,就是处理内存相关操作 3. operator new 和 operator delete 函数。这点很奇怪,在 C++中,某些运算符号可以重载为函 数来使用(尽管运算本身就是一种抽象的对数据处理的函数 方式),因此operator new和 operator delete是两个函数名称。但是这两种函数只是,分配 内存而不初始化。这点与 C语言的malloc和free比较类似。 4.类成员函数new/deleteo指的是类的成员函数,并 且函数名是new和deleteo这与3.中的函数有点类似,只是 3. 中的函数是标准空间中的函数,而类成员函数是类本身的成 员函数。 接下来,是这4条之间的关系。1.只是说明 new/delete两个单词程序员不能再定义使用,与具体的功能 毫无关系。2.是一条与实际条件相关的,具有内存分配功能 的表达式。 3.4是函数名,只是作用的空间大小不一样。简单说来就是 单词,表达式,函数名和函数名 单词,表达式, 函数名和函数名 当C++编译器碰到new/delete表达式的时候,它会去 new函数,那么它 new函数,那么它 如果表达式的对象并没有定义自己的成员 就会去调用全局的 new函数去分配内存;反之则调用成员函 数的new函数去分配内存。接着根据参数的不同,去调用相 new表达式会 new表达式会 在分配内存的阶段,new表达式会有2种分配方式:全局的 operator new 或者是自定义的new成员函数。而初始化工作是调用构造函 数来完成的。delete表达式功能和次序刚好相反,但是还是 同意的机制。这就是 new/delete相关几个概念的区别。一般 地,不要去修改全局的 operator new/ operator delete函数,但是根据需要,可以定义类的相应 的成员函数来改变内存分配的方式。 关于new还单有一种功能(其实也是 new的一种重载方式, 但不进行分配内存操作,只是返回原来的内存地址) ,就是 在指定的内存空间上创建一个对象,用法如下: char buff[20]; CNone* pNone = new (buff) CNone(); 假设CNone的大小不超过20个字节,那么就在 buff开头的 内存上,初始化一个对象。接着就可以通过 pNone来进行操 作。释放的方法如下: pNone-gt;~CNone(); 那么类pNone对象就会被释放,但是内存buff并没有 释放,依旧存在。 重载new/delete的原则是:尽量不要重载(很矛盾啊),除非 完全清楚具体的分配情况。如果要重载,那么要实行配对法 则。就是有new的重载,必须有其对应的 delete重载,尽管 有时候delete并不会进行内存的释放 常见的重载函数形式有(参考 lt;newgt;): void* operator new (size_t size) throw(std::bad_aHoc); void operator d

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档