operator new和 new operator的区别(More Effective C++_8(运算符))
2015-08-24 19:09
393 查看
一、分析区别
首先,我们先对new和delete表达式有深入了解,先看下面的语句
上述代码,实际上发生了三个步骤,第一步,调用名为operator new 的标准库函数,分配足够大的原始化的未类型化的内存,来保存指定类型的一个对象;第二步,运行该类型的一个构造函数,用于初始化构造对象;最后,返回指向新分配并设定了处置的指针;
上述,代码中的new,其实就是所谓的new operator操作,这个操作符是由语言内建的,不能改变意义,它的动作就分为上面三步:分配原始内存,初始化,返回指针;
再看
上述语句实际上有两步,第一步,对sp所指的对象调用适当的析构函数;第二步,调用名为operator delete的标准库函数释放该对象所用的内存;即delete sp,就相当于delete operator,它的动作分为以下两步:调用析构函数,释放内存空间;即
总结: operator new 唯一的任务就是分配内存,new operator的任务是取得 operator new 分配的内存,并将之转换为一个对象,返回一个指向它的指针;同理operator delete的唯一任务是释放内存空间,它不能调用析构函数;
因此,如果你只打算处理原始的、未设初值的内存,应该完全回避new operator 和delete operator,改调用operator new 取得内存并以operator delete归还给系统;
二、声明形式
operator new和operator delete函数有两个函数重载版本,每个版本支持相关的new表达式和delete表达式
三、placement new
针对一个已经存在的对象调用其构造函数是无意义的,因为构造函数是用来将对象初始化,而对象只能被初始化一次。但是有时你会有已经分配好的原始内存,你需要往上面构建对象,那么有个特别的operator new 版本,称为placement new 可以那么做;
即placement new 在已经分配的原始内存中初始化一个对象,它与new的其他版本不同,它不分配内存,相反,它接受已经分配内存,但是没有初始化的指针,并在该内存中初始化一个对象。实际上,placement new 使我们能够在特定的、预分配的内存地址中构造一个对象。其表达式是:
参考:More Effective C++中文版(侯捷译)、C++PRIME 第四版
首先,我们先对new和delete表达式有深入了解,先看下面的语句
string *sp=new string("hello");
上述代码,实际上发生了三个步骤,第一步,调用名为operator new 的标准库函数,分配足够大的原始化的未类型化的内存,来保存指定类型的一个对象;第二步,运行该类型的一个构造函数,用于初始化构造对象;最后,返回指向新分配并设定了处置的指针;
上述,代码中的new,其实就是所谓的new operator操作,这个操作符是由语言内建的,不能改变意义,它的动作就分为上面三步:分配原始内存,初始化,返回指针;
再看
delete sp;
上述语句实际上有两步,第一步,对sp所指的对象调用适当的析构函数;第二步,调用名为operator delete的标准库函数释放该对象所用的内存;即delete sp,就相当于delete operator,它的动作分为以下两步:调用析构函数,释放内存空间;即
sp->~class(); operator delete(ps);
总结: operator new 唯一的任务就是分配内存,new operator的任务是取得 operator new 分配的内存,并将之转换为一个对象,返回一个指向它的指针;同理operator delete的唯一任务是释放内存空间,它不能调用析构函数;
因此,如果你只打算处理原始的、未设初值的内存,应该完全回避new operator 和delete operator,改调用operator new 取得内存并以operator delete归还给系统;
二、声明形式
operator new和operator delete函数有两个函数重载版本,每个版本支持相关的new表达式和delete表达式
void* operator new(size_t) void* operator new[](size_t) void* operator delete(void*) void* operator delete[](void*)
三、placement new
针对一个已经存在的对象调用其构造函数是无意义的,因为构造函数是用来将对象初始化,而对象只能被初始化一次。但是有时你会有已经分配好的原始内存,你需要往上面构建对象,那么有个特别的operator new 版本,称为placement new 可以那么做;
即placement new 在已经分配的原始内存中初始化一个对象,它与new的其他版本不同,它不分配内存,相反,它接受已经分配内存,但是没有初始化的指针,并在该内存中初始化一个对象。实际上,placement new 使我们能够在特定的、预分配的内存地址中构造一个对象。其表达式是:
new (place_address) type;//place_address必须是一个指针 new (place_address) type(initializer-list);//initializer提供了初始化列表
参考:More Effective C++中文版(侯捷译)、C++PRIME 第四版
相关文章推荐
- C语言测试程序运行时间
- C/C++之回调函数
- c语言字符串操作,及常用函数
- C++构造函数初始化列表处提示出现 error: expected '{' before 'this'
- C++构造函数初始化列表处提示出现 error: expected '{' before 'this'
- Poco C++——JSON解析
- C++ 内存管理
- C++11(及现代C++风格)和快速迭代式开发
- C++中 pair 的用法
- 算法导论第三版-课后习题-自解
- c++下halcon配置
- C++中的static关键字
- CEF3与MFC(C++)的相互调用
- 从C++到COM,学习笔记(7)
- 《effective C++》:条款36——绝不重新定义继承而来的非虚函数
- 从C++到COM,学习笔记(6)
- 从C++到COM,学习笔记(5)
- 从C++到COM,学习笔记(4)
- LeetCode:Length of Last Word
- 从C++到COM,学习笔记(3)