zoukankan      html  css  js  c++  java
  • 典型问题分析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)。

  • 相关阅读:
    OpenStack 数据库操作 demo
    python 实现获取电脑IP、主机名、Mac地址
    openvswitch BFD 简介
    Python 获取主机名
    OpenvSwitch完全使用手册
    ovs datapath笔记
    openstack 实用命令
    表示数值的字符串 牛客网 剑指Offer
    反转单词顺序列 牛客网 剑指Offer
    第一个只出现一次字符的位置 牛客网 剑指Offer
  • 原文地址:https://www.cnblogs.com/-glb/p/12313882.html
Copyright © 2011-2022 走看看