【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
有过C语言编程的朋友大多知道,如果在malloc内存之后不及时free掉内存,那么很有可能会造成内存泄露的。那么在C++上面,是不是也存在这样的问题呢?结果是C++上面同样也存在内存泄露的危险。这个危险就是如果new后面不能delete的话,也会造成内存的泄露。还有不清楚的朋友可以看看下面的示例:
- class test
- {
- int data;
- public:
- test(int value):data(value) {}
- ~test() {};
- };
- void process()
- {
- test* t = new test(0);
- if(/* some errors happens */)
- {
- return;
- }
- delete t;
- return;
- }
- class auto_point
- {
- test* t;
- public:
- auto_point(test* p) : t(p) {}
- ~auto_point() { if(t) delete t;}
- };
- class auto_point
- {
- test* t;
- public:
- auto_point(test* p) : t(p) {}
- ~auto_point() { if(t) delete t;}
- test* operator->() { return t;}
- const test& operator* () {return *t;}
- };
那么有了这样的一个定义之后,我们应该怎么使用呢?大家可以看看下面的函数调用:
- 22: auto_point p(new test(0));
- 004010AD push 4
- 004010AF call operator new (00401300)
- 004010B4 add esp,4
- 004010B7 mov dword ptr [ebp-18h],eax
- 004010BA mov dword ptr [ebp-4],0
- 004010C1 cmp dword ptr [ebp-18h],0
- 004010C5 je process+56h (004010d6)
- 004010C7 push 0
- 004010C9 mov ecx,dword ptr [ebp-18h]
- 004010CC call @ILT+80(test::test) (00401055)
- 004010D1 mov dword ptr [ebp-1Ch],eax
- 004010D4 jmp process+5Dh (004010dd)
- 004010D6 mov dword ptr [ebp-1Ch],0
- 004010DD mov eax,dword ptr [ebp-1Ch]
- 004010E0 mov dword ptr [ebp-14h],eax
- 004010E3 mov dword ptr [ebp-4],0FFFFFFFFh
- 004010EA mov ecx,dword ptr [ebp-14h]
- 004010ED push ecx
- 004010EE lea ecx,[ebp-10h]
- 004010F1 call @ILT+65(auto_point::auto_point) (00401046)
- 004010F6 mov dword ptr [ebp-4],1
- 23: if(1/* some errors happens */)
- 004010FD mov edx,1
- 00401102 test edx,edx
- 00401104 je process+97h (00401117)
- 24: {
- 25: return;
- 00401106 mov dword ptr [ebp-4],0FFFFFFFFh
- 0040110D lea ecx,[ebp-10h]
- 00401110 call @ILT+75(auto_point::~auto_point) (00401050)
- 00401115 jmp process+0A6h (00401126)
- 26: }
- 27:
- 28: return;
- 00401117 mov dword ptr [ebp-4],0FFFFFFFFh
- 0040111E lea ecx,[ebp-10h]
- 00401121 call @ILT+75(auto_point::~auto_point) (00401050)
- 29: }
- template <typename type>
- class auto_point
- {
- type* t;
- public:
- auto_point(type* p) : t(p) {}
- ~auto_point() { if(t) delete t;}
- test* operator->() { return t;}
- const test& operator* () {return *t;}
- };