new和delete的三种形式详解
一、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的三种形式详解的更多相关文章
- [转]hibernate三种状态详解
本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼ 分类: hibernate ...
- 多表连接的三种方式详解 hash join、merge join、 nested loop
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...
- 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾
https://mp.weixin.qq.com/s/67NvEVljnU-0-6rb7MWpGw 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾 原创 蚂蚁金 ...
- Android 三种动画详解
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...
- Hibernate 的三种状态详解
hibernate的对象有3种状态,分别为:瞬时态(Transient).持久态(Persistent).脱管态(Detached). 处于持久态的对象也称为PO(Persistence Object ...
- PHP实现链式操作的三种方法详解
这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...
- Spring依赖注入三种方式详解
在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...
- Linux如何让进程在后台运行的三种方法详解
问题分析: 我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程.因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运 ...
- 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...
随机推荐
- LaTeX 使用:itemize,enumerate,description 用法
itemize和enumerate还有description 是LaTeX里列举的三种样式,分别讲一些使用技巧.itemize(意为分条目): \begin{itemize} \item[*] a \ ...
- 同步(Synchronous)和异步(Asynchronous)的概念
web项目中的同步与异步 在我们平时的web项目开发中会经常听到ajax请求这样一个称呼,在web项目中可以通过js或者jquery发送同步请求又或者异步请求,同步请求呢往往代表着你必须等待这次请求结 ...
- Software Testing Techniques LAB 02: Selenium
1. Installing 1. Install firefox 38.5.1 2. Install SeleniumIDE After installing, I set the view o ...
- Software Testing Techniques Homework 1
I have met some errors in recent years, one of them which impress me most. It happend when I try to ...
- 为什么使用.Net Core, Asp.net Core以及部署到云端
一,基于微软技术平台开发的应用项目,如果有以下的需求和潜在需求,建议使用.Net Core和Asp.net core技术架构: 1. 跨平台支持 2. 采用微服务架构 3. 使用Docker容器 4. ...
- c# 控制台定时程序
using System; using System.Timers; namespace DaoChuCore2 { class Program { static void Main(string[] ...
- select server
server with select #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> ...
- C#用ckplayer.js播放 MP4格式视频实现 边加载边播放
MVC设计模式下 在View页面里面使用ckplayer.js 加载视频 ,在MP4格式视频上传之后 我发现某些视频可以边加载边播放 但是有一些又不行,找了下原因是因为视频的元数据信息在第一帧的时候就 ...
- 沉淀再出发:PHP的中级内容
沉淀再出发:PHP的中级内容 一.前言 前面我们介绍了PHP的简单的语法知识以及相关的用法,接下来我们将PHP+mysql以及PHP+ajax结合起来进行研究. 二.PHP+mysql ...
- 数据链路层 点对点协议 PPP
点对点协议 PPP 一. PPP 协议应满足的需求 简单.提供不可靠的数据报服务,比IP协议简单,不需要纠错,不需要序号,不需要流量控制. 工作方式:接收方每收到一个帧就进行CRC校验,如正确就接受该 ...