C++_类和动态内存分配5-使用指向对象的指针
再探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-使用指向对象的指针的更多相关文章
- C++_类和动态内存分配4-有关返回对象的说明
返回方式: 返回指向对象的引用: 指向对象的const引用: const对象: =============================================== 返回指向const对象 ...
- C++_类和动态内存分配3-构造函数中使用new的注意事项
如果在构造函数中使用new来初始化对象的指针成员时必须特别小心. 1 如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete. 2 new和delete必须相互兼容.new对应于 ...
- C++_类和动态内存分配6-复习各种技术及队列模拟
知识点: 队列:是一种抽象的数据类型(Abstract Data Type),可以存储有序的项目序列. 新项目被添加在队尾,并可以删除队首的项目.队列有些像栈.栈是在同一端进行添加和删除.这使得栈是一 ...
- C++_类和动态内存分配1—动态内存和类
静态类成员 num_strings成员声明为静态存储类.静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象共享一个静态成员.num_strings成员可以 ...
- C++_类和动态内存分配2-改进后的String类
添加前面介绍过的复制构造函数和赋值运算符,使类能够正确管理类对象使用的内存. 知道对象何时被创建和释放. =================================== 修订后的默认构造函数 ...
- 《C++ Primer Plus》读书笔记之十—类和动态内存分配
第12章 类和动态内存分配 1.不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存.可以在类声明之外使用单独的语句进行初始化,这是因为静态类成员是单独存储的,而不是对象的 ...
- C++ primer plus读书笔记——第12章 类和动态内存分配
第12章 类和动态内存分配 1. 静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域运算符来指出静态成员所属的类.但如果静态成员是整形或枚举型const,则可以在类声明中初始化 ...
- C++——类和动态内存分配
一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...
- 《C++ Primer Plus》第12章 类和动态内存分配 学习笔记
本章介绍了定义和使用类的许多重要方面.其中的一些方面是非常微妙甚至很难理解的概念.如果其中的某些概念对于您来说过于复杂,也不用害怕——这些问题对于大多数C++的初学者来说都是很难的.通常,对于诸如复制 ...
随机推荐
- ReactNative项目创建及结构分析
- tomcat在linux服务器上部署应用
连接服务器 服务器地址:xxx.xxx.xxx.xxx 用户名:xxxx 密码:xxxx 进入到服务器中的tomcat路径,关闭服务器,例如 路径:/opt/wzgcyth/apache-tomcat ...
- 2-JRE System Libraty [eclipse-mars](unbound)
- C#实现访问网络共享文件夹
C#实现访问网络共享文件夹,使用 WNetAddConnection2A 和 WNetCancelConnection2A. 在目标服务器建立共享文件夹,建立访问账号test; public enum ...
- while 循环和do while循环
while循环是先检测条件符合不符合,符合才执行循环体内容,不符合就跳过while循环. 就和一个房间有两个门,一个前门,一个后门,while循环是当你进入前门的时候有人会检查你的身份,只有身份符合条 ...
- Monkey测试异常信息解读
查看包名 1.cmd 下面输入 adb locat > D:\test.txt 2.ctrl+c 停掉刚刚 1 运行的进程 3.打开test.txt文件--搜索 Displayed 对应的内 ...
- java 异常捕获与异常处理
try{会产生异常的代码 }catch(出现异常的类型 e){ 异常出现后处理的方法 } 一旦异常出现又没有异常处理,程序就会中断. public static void main(String[] ...
- Ubuntu安装开发版pidgin支持lwqq插件
sudo add-apt-repository ppa:lainme/pidgin-lwqq """添加pidgin-lwqq源""" s ...
- 【SQL】- 基础知识梳理(五) - 触发器
触发器的概念 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程 触发器的语法 create trigger tgr_name on table_name with encrypion –加 ...
- angular formBuilder