再探new和delete

new为创建的每一个对象的名称字符串分配存储空间,这是在构造函数中进行的;

析构函数使用delete来释放这些内存。

字符串是一个字符数组,所以析构函数使用的是带中括号的delete。

使用new来为整个对象分配内存:

String * favorite = new String(saying[choice]);

这不是为要存储的字符串分配内存,而是为对象分配内存;也就是说,为保存字符串地址的str指针和len成员分配内存。

指针和对象小结

使用常规表示法来声明指向对象的指针:

String * glamour;

可以将指针初始化为指向已有的对象;

String * first = &saying[0];

可以使用new来初始化指针,这将创建一个新的对象

String * favorite = new String(sayings[choice]);

对类使用new将调用相应的类构造函数来初始化新创建的对象:

//调用默认构造函数

String * gleep = new String;

//调用 String(const char *) 构造函数

String * glop = new String(“my my my”);

//调用 String(const String &)构造函数

String * favorite = new String(saying[choice]);

可以使用->运算符通过指针访问类方法:

if (saying[i].length()< shortest ->length())

可以对对象指针应用解除引用运算符(*)来获得对象

if (saying[i]<*first)

first = &saying[i];

12.5.3 再谈定位new运算符

定位new运算符能够让您能够在分配内存时能够指定内存位置。

char * buffer = new char[BUF];

JustTesting *pc1;

pc1 = new (buffer) JustTesting;  //定位new运算符

pc2 = new JustTesting(“Heap”,20);

pc3 = new (buffer +sizeof(JustTesting))JustTesting(“Better Idea”, 6);

使用定位new运算符来为对象分配内存,必须确保其析构函数被调用。如何确保呢?、对于在堆中创建的对象,可以这样做。

delete pc2;

但是对于pc1却不可以,原因在于delete可以与常规new运算符配合使用,却不能与定位new运算符配合使用。

Pc3没有收到new运算符返回的地址。因此delete pc3将导致运行阶段错误。

Delete pc1将释放buffer,而不是pc1;

系统没有为定位new运算符在该内存块中创建的对象调用析构函数。

对于这种情况,需要显式地为定位new运算符创建的对象调用析构函数。这是少数几个需要显式调用析构函数的情形。

pc3 ->~JustTesting();

pc1 ->~JustTesting();  //销毁对象的顺序,先销毁后创建的对象。类似于栈的先进后出顺序。

仅当所有对象都被销毁后,才能释放用于存储这些对象的缓冲区。

C++_类和动态内存分配5-使用指向对象的指针的更多相关文章

  1. C++_类和动态内存分配4-有关返回对象的说明

    返回方式: 返回指向对象的引用: 指向对象的const引用: const对象:  =============================================== 返回指向const对象 ...

  2. C++_类和动态内存分配3-构造函数中使用new的注意事项

    如果在构造函数中使用new来初始化对象的指针成员时必须特别小心. 1 如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete. 2 new和delete必须相互兼容.new对应于 ...

  3. C++_类和动态内存分配6-复习各种技术及队列模拟

    知识点: 队列:是一种抽象的数据类型(Abstract Data Type),可以存储有序的项目序列. 新项目被添加在队尾,并可以删除队首的项目.队列有些像栈.栈是在同一端进行添加和删除.这使得栈是一 ...

  4. C++_类和动态内存分配1—动态内存和类

    静态类成员 num_strings成员声明为静态存储类.静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象共享一个静态成员.num_strings成员可以 ...

  5. C++_类和动态内存分配2-改进后的String类

    添加前面介绍过的复制构造函数和赋值运算符,使类能够正确管理类对象使用的内存. 知道对象何时被创建和释放. =================================== 修订后的默认构造函数 ...

  6. 《C++ Primer Plus》读书笔记之十—类和动态内存分配

    第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的 ...

  7. C++ primer plus读书笔记——第12章 类和动态内存分配

    第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化 ...

  8. C++——类和动态内存分配

    一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...

  9. 《C++ Primer Plus》第12章 类和动态内存分配 学习笔记

    本章介绍了定义和使用类的许多重要方面.其中的一些方面是非常微妙甚至很难理解的概念.如果其中的某些概念对于您来说过于复杂,也不用害怕——这些问题对于大多数C++的初学者来说都是很难的.通常,对于诸如复制 ...

随机推荐

  1. POJ1039几何

    这道题目要求我们判断光线进入一条管道后可以抵达的最大的x坐标. 这是我做的第一道几何题目,卡了我半天.翻了不少书,才大概明白了些.既然是第一次做,就把所有今天学到的就全部写下好了. 1.如何判断平面上 ...

  2. libevent源码深度剖析十

    libevent源码深度剖析十 ——支持I/O多路复用技术 张亮 Libevent的核心是事件驱动.同步非阻塞,为了达到这一目标,必须采用系统提供的I/O多路复用技术,而这些在Windows.Linu ...

  3. 【总结整理】pv、uv

    1.pv的全称是page view,译为页面浏览量或点击量,通常是衡量一个网站甚至一条网络新闻的指标.用户每次对网站中的一个页面的请求或访问均被记录1个PV,用户对同一页面的多次访问,pv累计.例如, ...

  4. MyGeneration代码生成工具

    使用MyGeneration 生成代码:转自http://www.cnblogs.com/jack-liang/archive/2011/08/18/2144066.html 我们经常用数据访问层和业 ...

  5. Win10系统优化/设置脚本

    Win10系统优化/设置脚本 用了很长时间win10了,用的过程中,发现了一些问题,关于系统基本的优化,和个人的使用习惯设置等等,做成了一个脚本,可以一键设置win10的系统设置,结合DWS对Win1 ...

  6. InvocationtargetException 类型转换异常

    日期类型转换不了json格式数据 json转换数据的时候可以设置某个字段不需要转换 jsonconfig=new JsonConfig() //{} 内传入不需要转换的字段 jsonconfig.se ...

  7. ROS naviagtion analysis: costmap_2d--StaticLayer

    博客转载自:https://blog.csdn.net/u013158492/article/details/50493246 从UML中能够看到,StaticLayer主要是在实现Layer层要求实 ...

  8. 正确设置-Dfile.encoding参数

    正确设置-Dfile.encoding参数 摘自:https://blog.csdn.net/youge/article/details/6178265 2011年02月11日 10:18:00 阅读 ...

  9. 常用Linux命令:mount/umount/blkid

    一.mount:挂载命令 1.命令格式 mount [参数] [设备名称] [挂载点] 2.常用参数 -a     :安装在/etc/fstab文件中列出的所有文件系统 -f :伪装mount,做出检 ...

  10. Oracle动态执行表不可访问

    在scott 用户下,执行查询语句是出现"Oracle动态执行表不可访问" 经查,是因为用户权限不够所致,修改scott用户权限语句如下: grant select on V_$s ...