• 典型问题分析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)。

  • 相关阅读:
    08 正则表达式
    07 函数&对象
    06 Math&Date&Json
    05 数组&字符串
    04 循环控制
    03 流程控制
    02 数据类型&运算符
    大道至简
    Avg_row_length是怎么计算的?
    理解innodb buffer pool
  • 原文地址:https://www.cnblogs.com/-glb/p/12313882.html
Copyright © 2020-2023  润新知