什么空指针问题呢?首先看一下调用过程:创建一个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)。