现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

C++三种鲜为人知的使用方式

2013-10-20 07:03 工业·编程 ⁄ 共 1482字 ⁄ 字号 暂无评论

1.   普通new 也就是我们经常使用的new 
 
形式如下: 
 
int *p1=new int;                //   因此可以用指针是否为空不能判断分配空间是否成功  分配失败抛出异常 
 
//   现在很多C++程序员还以为是老样子 通过返回值判断是否分配成功 显然是错误的 
 
常用的方法,其对应的原函数为: 
 
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) 
 
        {       // try to allocate size bytes 
 
        void *p; 
 
        while ((p = malloc(size)) == 0) 
 
                if (_callnewh(size) == 0) 
 
                {       // report no memory 
 
                static const std::bad_alloc nomem; 
 
                _RAISE(nomem); 
 
                } 
 
        return (p); 
 
        } 
 
其中: 
 
#define _THROW1(x) throw (...) 
 
#define _RAISE(x) throw x 
 
throw (...)在函数声明中,表示函数中有抛出异常处理。 
 
2. 不抛出异常new    失败时候返回的时NULL 
 
int a; 
 
int *p3=new(&a) int;//3 
 
形式如下: 
 
int *p2=new(nothrow) int;  //  因此可以用指针是否为空判断分配空间是否成功 
 
不抛出异常的方法,其对应的原函数为: 
 
void * __CRTDECL operator new(size_t count, const std::nothrow_t&) 
 
_THROW0() 
 
{ // try to allocate count bytes 
 
void *p; 
 
_TRY_BEGIN 
 
p = operator new(count); 
 
_CATCH_ALL 
 
p = 0; 
 
_CATCH_END 
 
return (p); 
 

 
其中: 
 
#define _THROW0() throw () 
 
#define _TRY_BEGIN try { 
 
#define _CATCH(x) } catch (x) { 
 
#define _CATCH_ALL } catch (...) { 
 
#define _CATCH_END } 
 
这个函数调用了p = operator new(count)这是1中所说的形式,也就是可能有异常,但是2方法的原函数对这个异常有了处理, 
 
所以从整个函数来看是没有抛出异常的,实际上是函数本身调用了常规的new函数,然后并对异常做了处理。 
 
throw ()在函数声明中,表示函数中不抛出异常处理。 
 
3  置换new   这个new不会分配空间 只是重复使用已有的空间内存  来存储不同类型的对象  所以不用delete 
 
形式如下: 
 
int a; 
 
int *p3=new(&a) int;//3 
 
. 不申请新内存的方法,其原函数为: 
 
inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0() 
 
{ // construct array with placement at _Where 
 
return (_Where); 
 

 
直接把已有的内存地址返还给某个指针变量。_THROW0()表示函数中不抛出异常。 

给我留言

留言无头像?