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

 

posted @ 2020-02-15 21:43  一代枭雄  阅读(393)  评论(0编辑  收藏  举报