码迷,mamicode.com
首页 > 其他好文 > 详细

delete 类对象指针的注意事项]

时间:2015-10-23 01:35:37      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:

http://blog.csdn.net/infoworld/article/details/45560219

场景:
1. C++类有构造和析构函数,析构函数是在类对象被delete时(或局部变量自动销毁时)调用来释放资源。

2. C++类对象指针很多情况下需要赋值给void*通用指针来达到传输对象的目的,但是往往这种void*指针就是造成内存泄漏或程序错误的根源,

这就是为什么C++存在泛型的目的,它也是为了在编译时刻消除这种对象不确定性,避免delete或使用时的错误.

 

3. delete void*类型时,注意要强制转换为类类型才delete, 如 delete (A*) data_;

好了,看代码,以下代码有什么问题?

 

[cpp] view plaincopy
 
  1. // test_class.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <iostream>  
  6.   
  7. class A  
  8. {  
  9. public:  
  10.     A()  
  11.     {  
  12.         i = new int;  
  13.     }  
  14.   
  15.     ~A()  
  16.     {  
  17.         delete i;  
  18.     }  
  19.     int* i;  
  20. };  
  21.   
  22. class B  
  23. {  
  24. public:  
  25.     B(void* data)  
  26.     {  
  27.         data_ = data;  
  28.     }  
  29.       
  30.     ~B()  
  31.     {  
  32.         delete data_;  
  33.     }  
  34.     void* data_;  
  35. };  
  36.   
  37. template <class T>  
  38. class C  
  39. {  
  40. public:  
  41.     C(T* data)  
  42.     {  
  43.         data_ = data;  
  44.     }  
  45.     ~C()  
  46.     {  
  47.         delete data_;  
  48.     }  
  49.   
  50.     T* data_;  
  51. };  
  52.   
  53. void Wrong()  
  54. {  
  55.     A *a = new A();  
  56.     B b(a); //函数返回时A 的析构函数不会调用  
  57. }  
  58.   
  59. void Right()  
  60. {  
  61.     A *a = new A();  
  62.     C<A> c(a); //函数返回时A 的析构函数会调用  
  63. }  
  64.   
  65. int _tmain(int argc, _TCHAR* argv[])  
  66. {  
  67.     Wrong();  
  68.     Right();  
  69.     return 0;  
  70. }  

 

解析:

B 的析构里deleta data_, 看反汇编代码,并没有调用析构函数.

 

[plain] view plaincopy
 
  1. 011D1643  mov         eax,dword ptr [this]    
  2. 011D1646  mov         ecx,dword ptr [eax]    
  3. 011D1648  mov         dword ptr [ebp-0D4h],ecx    
  4. 011D164E  mov         edx,dword ptr [ebp-0D4h]    
  5. 011D1654  push        edx    
  6. 011D1655  call        operator delete (11D1096h)    


C 的析构里deleta data_, 看反汇编代码,有调用析构函数.

 

 

[plain] view plaincopy
 
    1. 011D1883  mov         eax,dword ptr [this]    
    2. 011D1886  mov         ecx,dword ptr [eax]    
    3. 011D1888  mov         dword ptr [ebp-0D4h],ecx    
    4. 011D188E  mov         edx,dword ptr [ebp-0D4h]    
    5. 011D1894  mov         dword ptr [ebp-0E0h],edx    
    6. 011D189A  cmp         dword ptr [ebp-0E0h],0    
    7. 011D18A1  je          C<A>::~C<A>+58h (11D18B8h)    
    8. 011D18A3  push        1    
    9. 011D18A5  mov         ecx,dword ptr [ebp-0E0h]    
    10. 011D18AB  call        A::`scalar deleting destructor‘ (11D102Dh)    
    11. 011D18B0  mov         dword ptr [ebp-0E8h],eax    
    12. 011D18B6  jmp         C<A>::~C<A>+62h (11D18C2h)    

delete 类对象指针的注意事项]

标签:

原文地址:http://www.cnblogs.com/guxuanqing/p/4903204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!