• 典型问题分析1一空指针问题


    什么空指针问题呢?首先看一下调用过程:
    创建一个NullPointerException类的对象
    (1)调用父类的构造函数Exception,并且以0作为参数;
    (2)调用到init函数,以3个0作为参数;
    (3)通过调用strdup函数,将message复制一份出来,然后将复制出来的message赋值给m_message,只不过这个时候的message是空指针;

    好像在我们的代码中并没有出现什么bug,报错之类的。事实真的是这样吗?

    在main.cpp中:

    #include <iostream>
    #include "Exception.h"
    using namespace std; using namespace DTLib; int main() { try { NullPointerException npe; cout << "throw" << endl; throw npe; } catch(const Exception& e) { cout << "catch" << endl; } return 0; }

    程序正常的结束了,测试结果表明在这个示例下没有问题。

    难道就真的没有问题吗?示例程序太短小了,不足以证明问题

    深入到标准C库中,看一下strdup的实现:

    #define strdup(str)  __strdup(str)
    char * __strdup (const char *s)
    {
      //没有判断s是不是空指针,默认s是不为空的
      size_t len = strlen (s) + 1;
      void *new = malloc (len);
    
      if (new == NULL)
        return NULL;
    
      return (char *) memcpy (new, s, len);
    }

    在Exception.h中的init函数中,需要判断message是否为空,如果message为空,那么直接返回一个NULL。

    m_message = (message ? strdup(message) : NULL)。

  • 相关阅读:
    论球迷和程序员
    山哥,你是怎么提高设计能力的?
    一个想休息的线程:JVM到底是怎么处理锁的?怎么不让我阻塞呢?
    由“面经”引发的思考
    99%的创业公司都不值得加入
    大牛是怎么炼成的?
    RMQ问题 与众不同 尚未攻克
    YbtOj例题:二叉堆3 龙珠游戏
    离散化模板
    YbtOJ练习:广搜 3 追捕小狗
  • 原文地址:https://www.cnblogs.com/-glb/p/12313882.html
Copyright © 2020-2023  润新知