我有一个名为 pTest 的 NULL 指针。如果使用指针调用函数,是否可以使应用程序立即崩溃。
问问题
180 次
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();
}
于 2012-04-14T03:08:26.730 回答
1
你的问题需要澄清。如果 pTest 是指向对象的空指针并且您在其上调用方法,那么我希望您的 VS2008 编译程序在以下情况下自行崩溃:
- 该方法是虚拟的
- 该方法尝试访问实例成员
这意味着如果方法调用在语义上是静态的并且不尝试访问实例成员,则该方法调用实际上可能会起作用。此外,这种事情的行为在调试和发布版本之间有所不同。
但是如果你想让你的应用程序在尝试调用方法之前/时直接崩溃,那么你可以在每个之前添加断言或条件中止。或者您可以在每个方法的开头添加一个 (this == NULL) 检查(但这不适用于会在到达此点之前触发崩溃的虚拟方法)。
于 2012-04-14T02:36:09.107 回答
0
您可能想抛出一个异常并且永远不会捕获它。那会让你的程序崩溃。
if (pTest == NULL)
throw std::invalid_argument("null pointer");
于 2012-04-14T02:54:26.240 回答