2012-04-14 63 views
0

我有一个名为pTest的空指针。如果使用指针调用函数,是否有可能立即使应用程序崩溃。NULL指针调用立即失败

+0

'pTest'是一个空指针的是什么?它是一个函数指针还是你作为参数传递的东西?如果是后者,则可以在函数中执行类似'if(pTest == NULL)abort()'的操作。 – 2012-04-14 02:14:42

+0

@KeithThompson如果它是前者,它应该自行炸毁。 – jpm 2012-04-14 02:19:29

+0

@jpm:它*应该*,但不能保证。 – 2012-04-14 02:27:55

回答

4

而不是使用一个原始指针,你可以创建一个受保护的指针类(智能指针的形式),陷阱指针引用。

#include <stdexcept> 

template<typename T> 
class CheckedPointer 
{ 
    T * ptr; 
public: 
    CheckedPointer(T * init = NULL) : ptr(init) {} 
    T * operator->() const 
    { 
     if (ptr == NULL) 
      throw std::runtime_error("dereference of NULL pointer"); 
     return ptr; 
    } 
    T & operator*() const 
    { 
     if (ptr == NULL) 
      throw std::runtime_error("dereference of NULL pointer"); 
     return *ptr; 
    } 
    // ... more members to make this a useful class 
}; 

class Test 
{ 
public: 
    void Foo() {} 
}; 

int main() 
{ 
    CheckedPointer<Test> pTest; 
    pTest->Foo(); 
} 

http://ideone.com/R4mUK

1

您的问题需要澄清。如果PTEST是一个空指针的对象和调用它的方法,那么我会期待你的VS2008编译的程序崩溃自身如果任:

  1. 的方法是虚拟
  2. 该方法尝试访问实例成员

这意味着如果方法调用语义上是静态的并且不尝试访问实例成员,则该方法调用可能实际上有效。此外,这种事情的行为在调试版本和发布版本之间有所不同。

但是,如果想让您的应用程序直接在尝试方法调用之前崩溃,那么您可以在每个方法调用之前添加断言或条件中止。或者你可以在每个方法的开始处添加一个(this == NULL)检查(但这不适用于在到达此点之前会触发崩溃的虚拟方法)。

0

您可能想要抛出一个异常并且永远不会捕获它。这会让程序崩溃。

if (pTest == NULL) 
    throw std::invalid_argument("null pointer");