你所认为的并不是正确的

  前几天看Redis源码时,截取了一段代码交给某位同事,问他们这样写有没有问题:

  typedef struct listNode{

            struct listNode * prev;

            struct listNode * next;

            void * value;

        }listNode;

        list * listNode(void)

        {

              listNode * node;

              if ((node = zmalloc(sizeof(*node))) == NULL){  //这行代码

                     //........

             }

        //.......

        }

        就说node是野指针,访问非法啥的。

  其实这么写是没有什么问题的,虽然在栈上为node开辟的字节里的位是脏的,但这里并没有访问那个地址,而且sizeof是编译器的。就比如:

  class CStu

        {

             int m_iData;

        public:

            void AccessNoMemberData()

            {

                cout<<"AccessNoMemberData"<<endl;

            }

     };

     CStu * pStu = NULL;

     pStu->AccessNoMemberData(); //这行代码

     这样写也没问题,虽然pStu == NULL。为什么呢?这行代码最终会被编译器转化为以下可能的形式:

     XXXXAccessNoMemberDataXXX(pStu)    

  成员函数被name mangled:XXXXAccessNoMemberDataXXX(CStu * const this);///具体可以看深度探索C++对象模型

  函数内部没有通过this访问成员,哪怕是NULL也不会造成core dump【要是访问成员变量就肯定core了】,可以通过查看对应的汇编代码。

  明天写下代码规范的问题和在没有core文件下如何定位造成core dump的代码行,需要懂些汇编知识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,783评论 0 33
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,819评论 0 9
  • 1.写一个NSString类的实现 +(id)initWithCString:(c*****t char *)nu...
    韩七夏阅读 3,810评论 2 37
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399