C++ new 和Placement New 以及nothrow new
2015-09-23 14:34
253 查看
转载自:http://www.cnblogs.com/xuxm2007/archive/2011/12/14/2288185.html
new有三种使用方式:plain new,nothrow new和placement new。
(1)plain new顾名思义就是普通的new,就是我们惯常使用的new。在C++中是这样定义的:
void* operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void *) throw();
提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL,因此通过判断返回值是否为NULL是徒劳的。
(2)nothrow new是不抛出异常的运算符new的形式。nothrow new在失败时,返回NULL。定义如下:
void * operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
(3)placement new意即“放置”,这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数。定义如下:
void* operator new(size_t,void*);
void operator delete(void*,void*);
提示1:palcement new的主要用途就是反复使用一块较大的动态分配的内存来构造不同类型的对象或者他们的数组。
提示2:placement new构造起来的对象或其数组,要显示的调用他们的析构函数来销毁,千万不要使用delete。
(1)
try
{
new char[100];
}
catch(std::bad_alloc e)
{
//...
}
(2) (3)
char* p = new(std::nothrow) char[100];
if(p == NULL)
{
printf("new failed");
};
long *q1 = new(p) long(100);
int *q2 = new(p) int[100/sizeof(int)];
这几句的意思是先用nothrow new申请char[100]空间,再在这片空间上申请一个long类型的空间存放100,然后是int型的数组
new有三种使用方式:plain new,nothrow new和placement new。
(1)plain new顾名思义就是普通的new,就是我们惯常使用的new。在C++中是这样定义的:
void* operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void *) throw();
提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL,因此通过判断返回值是否为NULL是徒劳的。
(2)nothrow new是不抛出异常的运算符new的形式。nothrow new在失败时,返回NULL。定义如下:
void * operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
(3)placement new意即“放置”,这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数。定义如下:
void* operator new(size_t,void*);
void operator delete(void*,void*);
提示1:palcement new的主要用途就是反复使用一块较大的动态分配的内存来构造不同类型的对象或者他们的数组。
提示2:placement new构造起来的对象或其数组,要显示的调用他们的析构函数来销毁,千万不要使用delete。
(1)
try
{
new char[100];
}
catch(std::bad_alloc e)
{
//...
}
(2) (3)
char* p = new(std::nothrow) char[100];
if(p == NULL)
{
printf("new failed");
};
long *q1 = new(p) long(100);
int *q2 = new(p) int[100/sizeof(int)];
这几句的意思是先用nothrow new申请char[100]空间,再在这片空间上申请一个long类型的空间存放100,然后是int型的数组
相关文章推荐
- 组合算法实现C语言,非递归
- C语言-----二维字符串数组内存图解
- C语言-----一位维指针数组的内存图解
- 【读书笔记:C++ primer plus 第六版 中文版】第18章 探讨C++新标准
- c++笔记
- 【读书笔记:C++ primer plus 第六版 中文版】第17章 输入、输出和文件
- 重载和多态之间的关系?!(C++初学者)
- C语言-----冒泡排序
- 【C/C++学院】0815-函数包装器/CPP类型转换/函数模块/动态数组
- 子类赋给父类(c++初学者)
- Eclipse下编写C++程序——CDT环境搭建
- C++初学者之RTTI
- C语言ADT(抽象数据类型编程)
- C++ 编译器的函数名修饰规则
- PAT (Basic Level) Practise (中文)1045. 快速排序(25) C语言
- Cassandra数据库用C++进行了重写,比原来快10倍!
- PAT (Basic Level) Practise (中文)1044. 火星数字(20) C语言
- PAT (Basic Level) Practise (中文)1043. 输出PATest(20) C语言
- PAT (Basic Level) Practise (中文)1042. 字符统计(20) C语言
- PAT (Basic Level) Practise (中文)1041. 考试座位号(15) C语言