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张图里我们看到了几点 ...
随机推荐
- iOS友盟分享的使用总结
现在几乎所有的APP都会集成分享,为了可以更好的推广自己的APP. 目前市面上常用的分享无非就三个: 1.友盟分享; 2.shareSDK(mob); 3.苹果原生. 由于苹果原生的分享使用起来不方便 ...
- Java和C# RSA加解密相互通信和使用公钥加密传输
关于JAVA和C#加解密通讯的话,可以用这个BouncyCastle插件,会帮助你解决很多问题 http://www.bouncycastle.org/ //c#使用java给的公钥进行rsa加密 p ...
- 产品从生到死的N宗罪
写在前面 昨天晚上做了一个梦,大概就是跟CTO,PM在说着什么..现在回想起好像就是说产品怎么怎么的..:索性就吐槽下这几个项目生与死的N宗罪吧.. 特别提示: 本文为全方位吐槽型,前方多处具有针对性 ...
- Python 爬虫练手项目—酒店信息爬取
from bs4 import BeautifulSoup import requests import time import re url = 'http://search.qyer.com/ho ...
- Oracle密码过期the password has expired解决办法
oracle 出现the password has expired这个问题,今天突然发现项目访问不了,一查发现用不了,也登不进去, 这个问题由是Oracle11g密码过期的原因导致的 调试Web项目的 ...
- update from select
CREATE TABLE dualx( x_id ) NOT NULL , x_con ) ) CREATE TABLE dualy( y_id ) NOT NULL , y_con ) ) ','x ...
- jq复制到剪切板插件clipboard.min.js(兼容IE9)
/*! * clipboard.js v1.5.5 * https://zenorocha.github.io/clipboard.js * * Licensed MIT 漏 Zeno Rocha * ...
- spring的权限控制,过滤器
spring的过滤器可以实现登录状态问题 1.创建一个AccessFilter类,基础代码 package com.ujia.util.access; import javax.servlet.htt ...
- Linux下的GPT分区
GPT分区 这是另外一种分区,针对MBR分区,它有很多优点: (1)几乎突破了分区个数的限制. 在GPT分区表中最多可以支持128个主分区. (2)单个分区容量几乎没有限制. 单个分区最大支持1EB容 ...
- DTCoreText 、WKWebView 、UIWebView的比较
DTCoreText .WKWebView .UIWebView的比较 HTML->View 数据解析: WebCore:排版引擎核心,WebCore包含主要以下模块:Loader, Parse ...