【M8】了解各种不同意义的new和delete
1、首先考虑new operator,new operator 可以认为做了三件事情:a、调用operator new分配一块内存;b、在这块内存上调用构造方法构造对象;返回指针。
2、operator new的声明如下:
void* operator new(size_t size)
和C中的malloc一样,operator new只负责分配内存。
3、考虑,string* ps = new string("hello"); 相当于做了下列事情:
a、void* memory = operator new (sizeof(string));
b、在*memory上面,调用string::string("hello"),构造对象;
c、返回指针,string* ps = static_cast<string*>(memory).
4、上面通过operator new 试图分配一块内存。这存在两个问题:a、底层接口通过一定算法分配一块可用的内存,有可能是耗时的;b、也许无法分配一块可用的内存。因此,就有了下面的需求:我提前分配一块内存,然后在这块内存上调用构造方法,构造对象,该怎么办呢?如下:
Widget* ConstructWidgetOnBuffer(void* buffer, int widgetSize)
{
return new (buffer) Widget(widgetSize);
}
这里的new operator不同于正常的new operator,中间有个(buffer)。这里的new operator调用placement new,placement new 声明如下:
void* operator new(size_t, void* location)
{
return location;
}
5、考虑,delete operator,可认为做了两件事:a、指向对象调用析构方法;b、执行operator delete释放内存。如下:
string* ps; delete ps; 相当于:
ps->~string();
operator delete(ps);
6、如果只是处理原始,未设初值的内存,不应该使用new operator和delete operator,而应该使用operator new和operator delete,如下:
void* buffer = operator new(20);
operator delete(buffer)
这类似于C中的方法malloc和free。
7、特别注意:new与delete的使用要匹配。分别是:
a、operator new 对应operator delete,前面不构造,后面不析构;
b、new operator对应delete operator;
c、对于placement new 不能使用delete operator,因为前者并不分配内存,只是使用已有的内存构造对象,而delete operator会释放内存,而这块内存别人可能还在使用。因此,应该只是调用析构方法;
d、是否带有[],new operator 和delete operator要匹配。如:string* ps = new string[10]; delete [] ps; delete时中括号放前面。
【M8】了解各种不同意义的new和delete的更多相关文章
- 不同意义的new和delete
补充说明: new/delete是运算符而非函数,operator new/delete并非是new/delete的重载.事实上,我们无法自定义new/delete的行为: operator new/ ...
- JavaScript小细节点罗列
共勉! 属性访问表达式 众所周知,JavaScript为属性的访问定义了两种语法方式: 表达式.标识符 // 表达式(指定对象) 标识符(指定需要访问的属性的名称) 表达式[表达式] //表达式1(指 ...
- ###《More Effective C++》- 操作符
More Effective C++ #@author: gr #@date: 2015-05-21 #@email: forgerui@gmail.com 五.对定制的"类型转换函数&qu ...
- More Effective C++ 35 条款
一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...
- JavaScript小细节点罗列(1)
共勉! 属性访问表达式 众所周知,JavaScript为属性的访问定义了两种语法方式: 表达式.标识符 // 表达式(指定对象) 标识符(指定需要访问的属性的名称) 表达式[表达式] //表达式1(指 ...
- 【C++】new和delete表达式与内存管理
new和delete表达式可以用来动态创建和释放单个对象,也可以用来动态创建和释放动态数组. 定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.new表达 ...
- MoreEffectiveC++Item35(操作符)(条款5-8)
条款5 对定制的"类型转换函数"保持警惕 条款6 区别increment/decrement操作符的前值和后置形式 条款7 千万不要重载&&,||,和,操作符 条款 ...
- More Effective C++ 35个改善方法
美·Scott Meyers 侯捷 More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Soluti ...
- C++ 内存分配操作符new和delete详解
重载new和delete 首先借用C++ Primer 5e的一个例子: string *sp = new string("a value"); ]; 这其实进行了以下三步操作: ...
随机推荐
- Android下fragment切换的动画效果
网上看到的例子,转过来记录一下,学习一下,感谢原作者的辛勤编码,效果非常好 基于Android3.0新增的动画api,效果很赞 共21种动画效果: <item>X轴缩放</item& ...
- MySQL5.6 replication architecture --原图来自姜承尧
- .NET面试题系列
索引: .NET框架基础知识[1] - http://www.cnblogs.com/haoyifei/p/5643689.html .NET框架基础知识[2] - http://www.cnblog ...
- POJ 1573 Robot Motion
Robot Motion Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12978 Accepted: 6290 Des ...
- sql server 2012序列号
MICROSOFT SQL SERVER 2012 企业核心版激活码序列号: FH666-Y346V-7XFQ3-V69JM-RHW28 MICROSOFT SQL SERVER 2012 商业智能版 ...
- [Papers]NSE, $u_3$, Lebesgue space [Jia-Zhou, NARWA, 2014]
$$\bex u_3\in L^\infty(0,T;L^\frac{10}{3}(\bbR^3)). \eex$$
- JAVA和C/C++之间的相互调用。
在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用. Java Native Interface (JNI)标准是java平台的一部分 ...
- 使用JSP处理用户注册和登陆
1. 这是一个JSP实例,由四个JSP页面组成,处理用户的注册和登陆信息2. 首先是login.jsp,代码如下:<html><center><form method=g ...
- PHP:6种GET和POST请求发送方法
在i94web博客中,我试过了畅言和多说两种社会化评论框,后来还是抛弃了畅言,不安全. 无论是畅言还是多说,我都需要从远程抓取文章的评论数,然后存入本地数据库.对于多说,请求的格式如下: // 获取评 ...
- BootStrap入门教程 (一) :手脚架Scaffolding(全局样式(Global Style),格网系统(Grid System),流式格网(Fluid grid System),自定义(Customing),布局(Layouts))
2011年,twitter的“一小撮”工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用.优雅.灵活.可扩展的前端工具集--BootStrap.Bootstrap由MARK ...