我有一个名为pTest的NULL指针。如果使用指针调用函数,是否可以立即使应用程序崩溃。
答案 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();
}
答案 1 :(得分:1)
您的问题需要澄清。如果pTest是一个指向对象的空指针并且你在它上面调用一个方法,那么我希望你的VS2008编译程序能够自行崩溃:
这意味着如果方法调用在语义上是静态的并且不尝试访问实例成员,则它实际上可以工作。此外,这种事情的行为因调试和发布版本而异。
但是如果你想要在尝试进行方法调用之前/之后直接使应用程序崩溃,那么你可以在每个之前添加断言或条件中止。或者你可以在每个方法的开头添加一个(this == NULL)检查(但这不会对虚拟方法起作用,这会在到达这一点之前触发崩溃)。
答案 2 :(得分:0)
你可能想要抛出一个异常而且永远不会抓住它。这会使你的程序崩溃。
if (pTest == NULL)
throw std::invalid_argument("null pointer");