对类对象使用new时地址分配的情况
我们知道,string类内部的构造函数是采用new来分配地址的。当创建对象时,会调用string的构造函数,从而实质上也使用了new。那么问题来了,如果我用new再创建一个string类型的指针呢?下面先来看我自己定义的String类。(注意:不是标准string类)
#ifndef STRING6_H_
#define STRING6_H_
#include <cstring> class String
{
private:
char * str;
int len; public:
String();
String(const char * s);
~String();
}; String::String()
{
len = ;
str = new char[len + ];
str[] = '\0';
std::cout << "String create in String():\n";
} String::String(const char * s)
{
len = std::strlen(s);
str = new char[len + ];
std::strcpy(str, s);
std::cout << "string create!\n";
std::cout << "(void*)str in class:" << (void*) str << std::endl;
}
这是一个简单的类,主要测试构造函数用new分配内存的情况。再来看看实质使用:
#include <iostream>
#include <string>
#include "string_6.h" int main(void)
{
using namespace std; String * pStr = new String("hehehe");
cout << "(void*)pStr: " << (void*)pStr << endl;
delete pStr; String * pStr1 = new String("I am a man!");
cout << "(void*)pStr1: " << (void*)pStr1 << endl;
delete pStr1; String * pStr2 = new String("I am a chinese!");
cout << "(void*)pStr2: " << (void*)pStr2 << endl;
delete pStr2; return ;
}
/*****************************
* string create!
* (void*)str in class:0xa84c40
* (void*)pStr: 0xa84c20
* String delete!
* string create!
* (void*)str in class:0xa84c40
* (void*)pStr1: 0xa84c20
* String delete!
* string create!
* (void*)str in class:0xa84c40
* (void*)pStr2: 0xa84c20
* String delete!
* ***************************/
本身String类里的构造函数已经用类new,我再main函数里再用一次new来创建一个String类型的指针。现在我们单单来看这一句:String * pStr = new String("hehehe"); ,这一句的步骤是:先用new分配一个String类型的无名地址,然后再调用String类的构造函数,然后这个构造函数再用new分配另一个地址,并且用“heheh”初始化。再然后String类再将“heheh”存储到开始new创建的无名地址。最后将pStr指向这个无名地址。所以我们看到(void*)pStr: 0xa84c20 的地址要比 (void*)str in class:0xa84c40 排得靠前。
之后我们来看看第一个delete语句,它是删除再main函数中new分配的内存的,在调用这个delete的前一瞬间触发了String类的析构函数,这个析构函数里面也有一个delete(看上面代码就清楚了),执行完析构函数中的delete后再执行main中的delete。至此,关于pStr的点点第第也就结束了。它用过的地址,也就被归还给系统了。当我们故技重施,会发现,后面的类型一样的语句会重新使用pStr使用国的内存。所以我们看到后面的地址输出和前面的是一样的。
对类对象使用new时地址分配的情况的更多相关文章
- 当我们用自定义的类对象作为key时,我们必须在程序中覆盖HashCode()和equals()。
Key值既然可以作为对象,那么也可以用一个自定义的类.比如: m.put(new sutdent(“Liucy”,30),”boss”) 如果没有语句来判定Student类对象是否相同,则会全部打印出 ...
- delete 类对象指针的注意事项]
http://blog.csdn.net/infoworld/article/details/45560219 场景:1. C++类有构造和析构函数,析构函数是在类对象被delete时(或局部变量自动 ...
- c++类对象的内存分布
要想知道c++类对象的内存布局, 可以有多种方式,比如: 1)输出成员变量的偏移, 通过offsetof宏来得到 2)通过调试器查看, 比如常用的VS 1.没有数据成员的对象 class A{ }; ...
- Python类对象
python类对象 python类对象支持两种操作:属性引用和实例化. 属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name. 有效的属性名称是类对象被创建时存在于类命名空 ...
- 关于c++11中static类对象构造函数线程安全的验证
在c++11中,static静态类对象在执行构造函数进行初始化的过程是线程安全的,有了这个特征,我们可以自己动手轻松的实现单例类,关于如何实现线程安全的单例类,请查看c++:自己动手实现线程安全的c+ ...
- Python - 面向对象编程 - 什么是 Python 类、类对象、实例对象
什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html Python 类 类定义语法 最简单的类定义看起来像这样 class ClassName: ...
- Qt窗体关闭时,如何自动销毁窗体类对象
Qt窗体关闭时,如何自动销毁窗体类对象 要对你的窗口设置WA_DeleteOnClose属性,默认的情况下关闭窗口仅仅意味着隐藏它 ImgWindow1->setAttribute(Qt ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- c++,类的对象作为形参时一定会调用复制构造函数吗?
c++,类的对象作为形参时一定会调用复制构造函数吗? 答:如果参数是引用传递,则不会调用任何构造函数:如果是按值传递,则调用复制构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行是存在, ...
随机推荐
- 6.Java集合总结系列:常见集合类的使用(List/Set/Map)
MARK 总结: Set.List 和 Map 可以看做集合的三大类. List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问. Set集合是无序集合,集合中的元素不可 ...
- Uva 10892 LCM Cardinality (数论/暴力)
题意:给出数n,求有多少组A,B的最小公约数为n; 思路:3000ms,直接暴力寻找,找到所有能把n整除的数 pi, 枚举所有pi 代码: #include <iostream> #inc ...
- 提交到SVN中的项目被删除 且项目名已经被新建项目占用找回方法
提到项目找回,一看就头疼,找回起来较麻烦.下面就讲一下. 首先,确定项目是否被删除?找项目,太多了,都被找一遍了,还是没找到,看看就头痛,换了个方法,找了个项目的包,xx.apk,反编译下吧,过程略, ...
- JavascriptS中的各结构的嵌套和函数
各位朋友大家好,上周更新给大家分享了JavaScript的入门知识及各种常用结构的用法,那么,本次更新博主就跟大家更深入的聊一聊JS各结构的嵌套用法,及JS中及其常用的一种结构--函数.以下为函数和循 ...
- java多线程基本概述(五)——线程通信
线程之间的通信可以通过共享内存变量的方式进行相互通信,也可以使用api提供的wait(),notify()实现线程之间的通信.wait()方法是Object类的方法,改方法用来将当前的线程置入&quo ...
- 关于css禁止文本复制属性
最近在做DHTMLX框架替换,新框架dhx的grid是不能选中内容复制的 虽然相对来说是安全些的,但是客户体验度一定会大打折扣 网页上禁止复制主要靠JavaScript来实现.<BODY onc ...
- JS获取URL中参数值(QueryString)的4种方法
方法一:正则法 function getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(& ...
- servlet:从入门到实战学习(1)---全·环境配置
最近公司忙加班学习,学校忙助教工作,博客鸽了好久,后端学习工作过程中学了好多东西,趁着工作之余得空补补博客,算是整理下学习的东西. javaweb的后端研发需要学习的是tomcat+servlet+j ...
- 深度学习入门实战(二)-用TensorFlow训练线性回归
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者 :董超 上一篇文章我们介绍了 MxNet 的安装,但 MxNet 有个缺点,那就是文档不太全,用起来可能 ...
- 战斗逻辑 - demo
创建战斗依赖的数据结构 /** * 角色属性 */ var a_data = { _id: 101, attr: { // 角色战斗属性 }, skill: [],// 技能数组 isAtk: fal ...