对类对象使用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++,类的对象作为形参时一定会调用复制构造函数吗? 答:如果参数是引用传递,则不会调用任何构造函数:如果是按值传递,则调用复制构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行是存在, ...
随机推荐
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(四)
一步步打造一个简单的 MVC 电商网站 - BooksStore(四) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- 面试题(二)—Java基础(下)
一.进程和线程 进程 (1)正在运行的程序,是系统进行资源分配和调用的独立单位. (2)每一个进程都有它自己的内存空间和系统资源. 线程 (1)是进程中的一条执行路径. (2)一个进程如果只有一条执行 ...
- !function 笔记
一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuery); 今天看到bootstrap的javascript组件是这样写的 !function( $ ){ ...
- Timer,TimerTask通过程序计数器实现的定时任务
1.程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看 做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型, 各种虚 ...
- ECharts 实现人民的名义关系图谱 代码开源
1.什么是ECharts ECharts是百度开源的纯 Javascript 图表库,目前开源可以与highcharts相匹敌的一个图表库,相信有很多国内用户使用. 官网 http://echarts ...
- Asp.Net 网站一键部署技术(下)
上一篇我们讲了服务端的配置,现在我们来说说客户端的配置. 0x01: 使用Visual Studio发布向导创建发布配置文件 然后新建配置文件,因为我们的网站可能会发布到多个地方,比如发布一份内网测试 ...
- 【原创】bootstrap框架的学习 第六课[bootstrap代码]
Bootstrap 允许您以两种方式显示代码: 第一种是 <code> 标签.如果您想要内联显示代码,那么您应该使用 <code> 标签. 第二种是 <pre> 标 ...
- 新建Android项目,会出现两个项目一个是自己创建的项目,另一个是“appcompat_v7”项目,这是怎么回事呢?该怎么解决呢?
做Android开发的朋友最近会发现,更新ADT至22.6.0版本之后,创建新的安装项目,会出现appcompat_v7的内容.并且是创建一个新的内容就会出现.这到底是怎么回事呢?原来appcompa ...
- 深入浅出学习HTTP协议
之前学习javaWeb只是大致了解了一下,今天重点介绍下http请求,当是复习吧! 一.http基础概念 1.什么是http协议? HTTP是Hyper Text Transfer Protocol( ...
- 【国家集训队2012】tree(伍一鸣)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 ...