关于C++NEW关键字
来源:互联网 发布:产品宣传视频制作软件 编辑:程序博客网 时间:2024/05/14 15:28
全局的new有六种重载形式:
void *operator new(std::size_t count)throw(std::bad_alloc); //一般的版本
void *operator new(std::size_t count, const std::nothrow_t&) throw(); //兼容早版本的new,内存分配失败不会抛出异常
void *operator new(std::size_t count, void *ptr) throw(); //placement版本
void *operator new[](std::size_t count)throw(std::bad_alloc);
void *operator new[](std::size_t count, const std::nothrow_t&) throw();
void *operator new[](std::size_t count, void *ptr) throw();
所以, 刚才的用法, 就是使用new函数的一种重载形式。
如果A这个对象以同样实行重载了new函数的化, 作为成员函数会被优先调用。
C++的各种new简介
1.new T
第一种new最简单,调用类的(如果重载了的话)或者全局的operator new分配空间,然后用
类型后面列的参数来调用构造函数,用法是
new TypeName(initial_args_list)。 如果没有参数,括号一般可以省略。例如
int *p=new int;
int *p=new int(10);
int *p=new foo("hello");
通过调用delete来销毁:
delete p;
2. new T[]
这种new用来创建一个动态的对象数组,他会调用对象的operator new[]来分配内存(如果没有则调用operator new,搜索顺序同上),然后调用对象的默认构造函数初始化每个对象
用法:
new TypeName[num_of_objects];
例如
int *p= new int[10];
销毁时使用operator delete[]
3.new()T 和new() T[ ]
这是个带参数的new,这种形式的new会调用operator new(size_t,OtherType)来分配内存这里的OtherType要和new括号里的参数的类型兼容,这种语法通常用来在某个特定的地址构件对象,称为placement new,前提是operator new(size_t,void*)已经定义,通常编译器已经提供了一个实现,包含<new>头文件即可,这个实现只是简单的把参数的指定的地址返回,因而new()运算符就会在括号里的地址上创建对象需要说明的是,第二个参数不是一定要是void*,可以识别的合法类型,这时候由C++的重载机制来决定调用那个operator new。当然,我们可以提供自己的operator new(size_,Type),来决定new的行为,比如
char data[1000][sizeof(foo)];
inline void* operator new(size_t ,int n)
{
return data[n];
}
就可以使用这样有趣的语法来创建对象:
foo *p=new(6) foo(); //把对象创建在data的第六个单元上
的确很有意思
标准库还提供了一个nothrow的实现:
void* operator new(std::size_t, const std::nothrow_t&) throw();
void* operator new[](std::size_t, const std::nothrow_t&) throw();
就可以实现调用new失败时不抛出异常
new(nothrow) int(10);// nothrow 是std::nothrow_t的一个实例
placement new 创建的对象不能直接delete来销毁,而是要调用对象的析够函数来销毁对
象,至于对象所占的内存如何处理,要看这块内存的具体来源
4. operator new(size_t)
这个的运算符分配参数指定大小的内存并返回首地址,可以为自定义的类重载这个运算符,方法就是在类里面声明加上
void *operator new(size_t size)
{
//在这里分配内存并返回其地址
}
无论是否声明,类里面重载的各种operator new和operator delete都是具有static属性的一般不需要直接调用operator new,除非直接分配原始内存(这一点类似于C的malloc)在冲突的情况下要调用全局的operator加上::作用域运算符:
::operator new(1000); // 分配1000个字节
返回的内存需要回收的话,调用对应的operator delete
5.operator new[](size_t)
这个也是分配内存,只不过是专门针对数组,也就是new T[]这种形式,当然,需要时可以显式调用
6.operator new(size_t size, OtherType other_value)
和operator new[](size_t size, OtherType other_value)
参见上面的new()
需要强调的是,new用来创建对象并分配内存,它的行为是不可改变的,可以改变的是各种
operator new,我们就可以通过重载operator new来实现我们的内存分配方案。
- 关于C++NEW关键字
- 关于C++关键字new
- C++-关键字new和delete
- 关于接口interface和new关键字
- C#.net 关键字之new老司机教学 net new
- 关于c++static关键字和extern关键字
- 关键字new
- 关键字 NEW
- New 关键字
- new关键字
- 关键字new
- new关键字
- 关于c中volatile关键字
- 关于c中volatile关键字
- C#中关于new关键字带来的无限递归错误
- Java中关于关键字new创建字符串对象的总结
- .NET(c#)new关键字的三种用法
- .NET(c#)new关键字的三种用法 (转载)
- 分享一些前端开发人员必备的工具,脚本和资源
- [动态规划]4.3.1 Buy Low, Buy Lower
- 久违了的.net
- linux vi编辑器常用命令
- 做题笔记之------母函数求递推式
- 关于C++NEW关键字
- ASP.NET Application and Page Life Cycle
- Lance老师UI系列教程第三课->QQ登录注册界面的实现(android-2012最新版)
- 单模光纤与多模光纤区别
- Iframe自适应高度
- 透过Bit Field(位字段)看内存
- C++读取bmp位图入门
- android单元测试
- S3C6410开发全纪录(三)《UBOOT中添加DM9000AE网卡驱动》