【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"); ]; 这其实进行了以下三步操作: ...
随机推荐
- poj 2773 Happy 2006
// 题意 :给你两个数 m(10^6),k(10^8) 求第k个和m互质的数是什么这题主要需要知道这样的结论gcd(x,n)=1 <==> gcd(x+n,n)=1证明 假设 gcd(x ...
- 【转】Linux时间函数之gettimeofday()函数之使用方法
原文网址:http://blog.csdn.net/tigerjibo/article/details/7039434 一.gettimeofday()函数的使用方法: 1.简介: 在C语言中可以使用 ...
- C/C++面试小知识点
1.static有什么用途. 解答: 在函数体中,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其 ...
- hdu1792 水题
最近转到vim上来了,用vim编写代码,用gcc编译,用gdb调试.这是用vim做的第一道题,纪念下.题目很水,就不说了. /* * Author : ben */ #include <cstd ...
- [Irving] Wpf DevexPress GridControl 获取选中行
WPF前台绑定事件代码: <RelayAction TargetControl="{Binding ElementName=GCInstoragePart}" MethodN ...
- Codeforces Round #363 (Div. 1) C. LRU
题意: n个数,长度为k的缓存,每次询问,每个数以pi的概率被选,如果不在缓存区则加入,如果缓存区满了,则第一个进缓存的出来,问10^100次询问以后每个数在缓存的概率 思路: 状压DP,看了hzwe ...
- 利用redis分布式锁的功能来实现定时器的分布式
文章来源于我的 iteye blog http://ak478288.iteye.com/blog/1898190 以前为部门内部开发过一个定时器程序,这个定时器很简单,就是配置quartz,来实现定 ...
- Hbase Basic Prerequisites
Table 2. Java HBase Version JDK 6 JDK 7 JDK 8 1.0 Not Supported yes Running with JD ...
- 关于登录的会话控制, 终极解决方案 - chunyu
登录是用cookie还是session实现,一直有争议,普遍认为session更安全,可是有些功能,用cookie最方便也最高效,比如“记住我一周”. cookie还是session,我的答案是两 ...
- Unity3D-数学相关
1. Transform.rotation:对象在世界坐标系下的旋转:Transform.localRotation:对象在父对象的局部坐标系下的旋转.两个变量的类型均为四元素. (1)得到游戏对象当 ...