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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值