外传三 动态内存申请的结果

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 应用开发动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )

第84题二维数组的动态内存申请 | malloc 的应用

动态内存申请的结果

第83题一维数组的动态内存申请 | malloc 的应用

C++函数中,两个自动释放内存的动态内存申请类