一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling

  1. <spanstyle="font-size:18px;">我们从实验中去总结问题
  2. 测试一: virtual 函数和non-virtual函数
  3. 01.#include<stdio.h>
  4. 02.class A
  5. 03.{
  6. 04.public:
  7. 05. void function(){printf("Hello World");} //无virtual关键字
  8. 06.
  9. 07.};
  10. 08.
  11. 09.class B
  12. 10.{
  13. 11.public:
  14. 12. virtual void function(){printf("Hello World");}
  15. 13.};
  16. 14.
  17. 15.int main( )
  18. 16.{
  19. 17. A*p1=NULL;
  20. 18. p1->function(); //正常运行
  21. 19.
  22. 20. B*p2=NULL;
  23. 21. p2->function(); //crash,Why?
  24. 22. Return 0;
  25. 23.};
  26. 测试结果:18行正常,21行crash。
  27. 为什么18行正常,21行死机呢?
  28. 其原因是:
  29. 每一个非虚成员函数实际上都等同于一个普通的C函数,其中第一个参数为对象指针,即我们常说的this指针。例如:
  30. 上面的A的function函数实际等同于:<spanstyle="color:#ff0000;">A::Function() ç==================èFunction(A*this);
  31. span>与此不同,对每一个虚成员函数的调用都是通过虚函数表的虚指针vptr来进行调用的,如上面的p2->function一句将被编译器解释为:
  32. (* p2->vptr[1] )(p2)
  33. 很容易理解,虚函数的调用是动态决定的。也很容易理解,21行crash,18行正常。很显然,如果在A类的成员函数function里,有去使用成员变量,该函数同样会crash.
  34. <imgalt=""src="http://my.csdn.net/uploads/201208/03/1343961187_7766.jpg">
  35. 我们再来看看测试二:关于C++ static 成员函数
  36. #include"stdio.h"
  37. #include"stdafx.h"
  38. #include<stdio.h>
  39. class A
  40. {
  41. public:
  42. void function(){ printf("Hello World");}
  43. static A* instance();
  44. A();
  45. };
  46. static A *Test1=NULL;
  47. A::A()
  48. {
  49. Test1=this;
  50. }
  51. A* A::instance()
  52. {
  53. return Test1;
  54. }
  55. int main( )
  56. {
  57. A *StackObj=newA;
  58. delete StackObj;//Don’t set it to null intentionally….
  59. while(StackObj && StackObj->instance() )
  60. {
  61. printf("Error--->%d.\n",StackObj);
  62. }
  63. return 0;
  64. };
  65. Static函数没有this指针,可以认为他就是普通的c函数。
  66. 普通的c函数编译器都是通过name mangling技术,来对函数加以区分:
  67. StackObj->instance()等同于:ZN1A8instanceEv()
  68. 备注:
  69. ①事实上编译器为了避免函数重载造成的重名情况,会对函数的名字进行处理,使之成为独一无二的名称。 (name mangling技术)
  70. ②将成员函数声明为static,可以使成员函数不经由this指针便可调用。
  71. ③vptr表中,索引号0为类的type_info。

http://blog.csdn.net/acs713/article/details/7825994
原文链接: https://www.cnblogs.com/wangicter/archive/2012/10/05/4767272.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/64921

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午11:36
下一篇 2023年2月9日 上午11:36

相关推荐