一、new操作符、delete操作符

class String
{
public:
String(const char *str="")
{
if(str== NULL)
{
data=new char[];
data='\0';
}
else
{
data=new char[strlen(strlen(str)+];
strcpy(data,str);
}
~String()
{
delete[] data;
data=NULL;
}
private:
char *data;
};

在上面的String类中,当你去定义一个String对象时,用new去创建对象时,用delete去析构该对象时,此时new

和delete有两个操作,分别是当用new创建对象时,第一步是先去开辟内存空间,第二步则是使用构造函数去构造对

象。同样当用delete去析构对象时也同样有两个操作,第一步是去调用析构函数去析构对象,第二步则是释放其内存

空间。在使用new创建对象时和用delete析构对象时,它们的顺序是相反的。

二、操作符new、操作符delete

void* operator new(size_t sz)
{
void *p= malloc(sz);
return p;
}
void operator delete(void *p)
{
free(p);
} void* operator new[](size_t sz)
{
void *p= malloc(sz);
return p;
}
void operator delete[](void *p)
{
free(p);
}

当你去创建一个对象时,new操作符则会包含两步操作,第一步先去调用上面的重载操作符new的函数,先去开辟

内存空间,第二步去调用类的构造函数去构造对象。当去析构一个对象时,delete操作符也同样包含两步操作,第

一步先去调用类的析构函数去析构对象,第二步调用上面的重载操作符delete的函数,将内存空间释放。同样的,这

是用new创建单个对象的函数,当你需要动态开辟数组空间时,下面两个函数则是开辟数组空间的函数和释放数组内

存空间的函数。需要特别注意的是,void* operator new(size_t sz);函数的参数类型必须是size_t类型即无符号整

数类型,且函数的返回值必须是void*类型,否则编译不通过,下面的开辟数组空间的函数也是一样的。

三、定位new

void* operator new(size_t sz)
{
void *p= malloc(sz);
return p;
}
void operator delete(void *p)
{
free(p);
} void* operator new[](size_t sz)
{
void *p= malloc(sz);
return p;
}
void operator delete[](void *p)
{
free(p);
}
class String
{
public:
String(const char *str="")
{
if(str== NULL)
{
data=new char[];
data='\0';
}
else
{
data=new char[strlen(strlen(str)+];
strcpy(data,str);
}
~String()
{
delete[] data;
data=NULL;
}
private:
char *data;
};
void* operator new(size_t sz,int *d,int pos)
{
return &d[pos];
}
int main()
{
String *ps= (String*)operator new(sizeof(String));
new(ps)String("Hello");
ps->~String();
operator delete(ps);
//new(p)类型(初始值)
int ar[];
new(ar,)int();
new(ar,)int();
new(ar,)int();
return ;
}

定位new即运算符new进行重载,在重载的函数中需要去使用一个额外的指针去指向所开辟的数组空间,pos即

数组中的下标位置,即将所需要的数据插入到指定的pos位置,这就是定位new。

new和delete的三种形式详解的更多相关文章

  1. [转]hibernate三种状态详解

    本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼   分类: hibernate ...

  2. 多表连接的三种方式详解 hash join、merge join、 nested loop

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...

  3. 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾

    https://mp.weixin.qq.com/s/67NvEVljnU-0-6rb7MWpGw 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾 原创 蚂蚁金 ...

  4. Android 三种动画详解

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...

  5. Hibernate 的三种状态详解

    hibernate的对象有3种状态,分别为:瞬时态(Transient).持久态(Persistent).脱管态(Detached). 处于持久态的对象也称为PO(Persistence Object ...

  6. PHP实现链式操作的三种方法详解

    这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...

  7. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  8. Linux如何让进程在后台运行的三种方法详解

    问题分析: 我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程.因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运 ...

  9. 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...

随机推荐

  1. 横向开关(switch)

    横向开关(switch) 一:属性 1.Activity //横向开关 public class SwitchActivity extends Activity { private Switch sw ...

  2. Selenium对浏览器的支持

    1.火狐浏览器 优点:FireFox Dirver对页面的自动化测试支持得比较好,很直观地模拟页面的操作,对JavaScript的支持也非常完善,基本上页面上做的所有操作FireFox Driver都 ...

  3. Ubuntu更换硬盘

    0x00 背景: 目前ubuntu用的是一个80g的硬盘( 一开始没买硬盘,直接拆了一个老老老老的机子来用),系统16.04, 只有一个/分区 ( /dev/sdb1 ) . 新的硬盘是一块256G的 ...

  4. Windows ->> Windows下安装MSI程序遇到2503和2502错误

    三个步骤可以解决这个问题: 1) 以管理员身份开启命令行模式并键入msiexec /package <msi文件路径> 2) 修改组策略 计算机配置 ->> 管理模板 -> ...

  5. Python学习---Django误删除sql表后,如何创建数据

    误删除sql表后,怎么创建数据? 仅仅适合单表,多表因为涉及约束, python mangage.py makemigrations  --> 生成migrations目录和根数据库对应的sql ...

  6. Linux 配置samba服务实现与Windows文件共享

    目录: 1.samba服务介绍 2. 安装samba服务和客户端 3.samba配置文件详解 4.配置实例 5.客户端挂载与测试 6.samba排错 1.Samba服务介绍     Samba 最先在 ...

  7. 自动化测试全套流程(一)-搭建Jenkins环境

    前提 既然要做自动化测试,那我们就做得彻底一些,将整套系统部署在Linux服务器上,在搭建Jenkins环境之前,我已经通过VirtualBox安装了一个CentOS的服务器,搭建Jenkins是基于 ...

  8. [BZOJ 1552] 排序机械臂

    Splay大法是坠吼滴! 1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 436  Solved: ...

  9. 鸡肋提权之变态root利用

    你急有毛用,我电脑没带,怎么搞? 联系了基友adminlm牛看看吧,他说有防护软件啥的,有root,无法UDF,于是我让他去Mof,经历一番周折,知道了,对mof目录也锁定了权限,无法用root导出m ...

  10. CentOS7.X安装Redis-4.0.8以及Redis集群搭建

    安装redis 安装前的准备 yum install \ vim \ wget \ make \ gcc \ gcc-c++ \ automake \ autoconf \ -y \ 下载解压并安装 ...