外传三 动态内存申请的结果
Posted wanmeishenghuo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外传三 动态内存申请的结果相关的知识,希望对你有一定的参考价值。
问题:
动态内存申请一定成功吗?
问题:
new语句中的异常是怎么抛出来的?
一般我们会在new_handler函数中进行内存的整理,整理之后再次申请。
问题:
如何跨编译器统一new的行为,提高代码移植性?
全局定义new就是全局new操作符的重载。
最后两种方法是推荐的做法。
使用nothrow时,new失败了会返回空指针。
示例程序:
1 #include <iostream> 2 #include <new> 3 #include <cstdlib> 4 #include <exception> 5 6 using namespace std; 7 8 class Test 9 { 10 int m_value; 11 public: 12 Test() 13 { 14 cout << "Test()" << endl; 15 16 m_value = 0; 17 } 18 19 ~Test() 20 { 21 cout << "~Test()" << endl; 22 } 23 24 void* operator new (unsigned int size) throw() 25 { 26 cout << "operator new: " << size << endl; 27 28 // return malloc(size); 29 30 return NULL; 31 } 32 33 void operator delete (void* p) 34 { 35 cout << "operator delete: " << p << endl; 36 37 free(p); 38 } 39 40 void* operator new[] (unsigned int size) throw() 41 { 42 cout << "operator new[]: " << size << endl; 43 44 // return malloc(size); 45 46 return NULL; 47 } 48 49 void operator delete[] (void* p) 50 { 51 cout << "operator delete[]: " << p << endl; 52 53 free(p); 54 } 55 }; 56 57 void my_new_handler() 58 { 59 cout << "void my_new_handler()" << endl; 60 } 61 62 void ex_func_1() 63 { 64 new_handler func = set_new_handler(my_new_handler); 65 66 try 67 { 68 cout << "func = " << func << endl; 69 70 if( func ) 71 { 72 func(); 73 } 74 } 75 catch(const bad_alloc&) 76 { 77 cout << "catch(const bad_alloc&)" << endl; 78 } 79 } 80 81 82 int main(int argc, char *argv[]) 83 { 84 ex_func_1(); 85 86 return 0; 87 }
第64行用于将我们自己的new处理函数设置进去并且返回编译器默认的new处理函数,并赋值给func,运行结果如下:
打印结果为0,说明了编译器没有默认的new处理函数。
vs2010的运行结果如下:
bcc编译器的结果如下:
可以看到bcc编译器是有默认的new处理函数的。
而且func函数确实抛出了bad_alloc异常。
以上是关于外传三 动态内存申请的结果的主要内容,如果未能解决你的问题,请参考以下文章
Android 应用开发动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )