0

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

4

3 回答 3

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

于 2012-04-14T03:08:26.730 回答
1

你的问题需要澄清。如果 pTest 是指向对象的空指针并且您在其上调用方法,那么我希望您的 VS2008 编译程序在以下情况下自行崩溃:

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

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

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

于 2012-04-14T02:36:09.107 回答
0

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

if (pTest == NULL)
  throw std::invalid_argument("null pointer");
于 2012-04-14T02:54:26.240 回答