NULL指针调用立即失败

时间:2012-04-14 02:11:50

标签: c++ visual-studio-2008

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

  1. 方法是虚拟的
  2. 该方法尝试访问实例成员
  3. 这意味着如果方法调用在语义上是静态的并且不尝试访问实例成员,则它实际上可以工作。此外,这种事情的行为因调试和发布版本而异。

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

答案 2 :(得分:0)

你可能想要抛出一个异常而且永远不会抓住它。这会使你的程序崩溃。

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