C++ 空指针调用立即失败
我有一个名为pTest的空指针。如果使用指针调用函数,是否可能使应用程序立即崩溃 你的问题需要澄清。如果pTest是指向某个对象的空指针,并且您在该对象上调用了一个方法,那么我希望您的VS2008编译程序在以下情况下自行崩溃:C++ 空指针调用立即失败,c++,visual-studio-2008,C++,Visual Studio 2008,我有一个名为pTest的空指针。如果使用指针调用函数,是否可能使应用程序立即崩溃 你的问题需要澄清。如果pTest是指向某个对象的空指针,并且您在该对象上调用了一个方法,那么我希望您的VS2008编译程序在以下情况下自行崩溃: 该方法是虚拟的 该方法尝试访问实例成员 这意味着,如果方法调用在语义上是静态的,并且不尝试访问实例成员,那么它实际上可以工作。此外,这种行为在调试版本和发布版本之间有所不同 但是,如果您希望在尝试调用方法之前/之后直接使应用程序崩溃,那么您可以在每次调用之前添加断言或条件
但是,如果您希望在尝试调用方法之前/之后直接使应用程序崩溃,那么您可以在每次调用之前添加断言或条件中止。或者,您可以在每个方法的开头添加一个(this==NULL)检查(但这对虚拟方法不起作用,虚拟方法会在到达此点之前触发崩溃)。您的问题需要澄清。如果pTest是指向某个对象的空指针,并且您在该对象上调用了一个方法,那么我希望您的VS2008编译程序在以下情况下自行崩溃:
但是,如果您希望在尝试调用方法之前/之后直接使应用程序崩溃,那么您可以在每次调用之前添加断言或条件中止。或者,您可以在每个方法的开头添加一个(this==NULL)检查(但这对在到达此点之前触发崩溃的虚拟方法不起作用)。您可能希望抛出一个异常,但永远不会捕获它。那会使你的程序崩溃
if (pTest == NULL)
throw std::invalid_argument("null pointer");
你可能想抛出一个异常,却永远也抓不到它。那会使你的程序崩溃
if (pTest == NULL)
throw std::invalid_argument("null pointer");
您可以创建一个受保护的指针类(智能指针的一种形式)来捕获取消引用,而不是使用原始指针
#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();
}
#包括
模板
类检查指针
{
T*ptr;
公众:
CheckedPointer(T*init=NULL):ptr(init){}
T*运算符->()常量
{
如果(ptr==NULL)
抛出std::runtime_错误(“空指针的取消引用”);
返回ptr;
}
T&运算符*()常数
{
如果(ptr==NULL)
抛出std::runtime_错误(“空指针的取消引用”);
返回*ptr;
}
//…更多的成员使其成为一个有用的类
};
课堂测试
{
公众:
void Foo(){}
};
int main()
{
检查指针测试;
pTest->Foo();
}
您可以创建一个受保护的指针类(智能指针的一种形式)来捕获取消引用,而不是使用原始指针
#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();
}
#包括
模板
类检查指针
{
T*ptr;
公众:
CheckedPointer(T*init=NULL):ptr(init){}
T*运算符->()常量
{
如果(ptr==NULL)
抛出std::runtime_错误(“空指针的取消引用”);
返回ptr;
}
T&运算符*()常数
{
如果(ptr==NULL)
抛出std::runtime_错误(“空指针的取消引用”);
返回*ptr;
}
//…更多的成员使其成为一个有用的类
};
课堂测试
{
公众:
void Foo(){}
};
int main()
{
检查指针测试;
pTest->Foo();
}
pTest
是指向什么的空指针?它是函数指针还是作为参数传递的东西?如果是后者,您可以在函数中执行类似于If(pTest==NULL)abort()
的操作。@KeithThompson,如果是前者,它应该自己爆炸。@jpm:应该爆炸,但不能保证。您可以在函数中添加“assert(this);”。它在技术上不合法,但在您的平台上有效。@DavidSchwartz:为什么它在技术上不合法?pTest
是指向什么的空指针?它是函数指针还是作为参数传递的东西?如果是后者,您可以在函数中执行类似于If(pTest==NULL)abort()
的操作。@KeithThompson,如果是前者,它应该自己爆炸。@jpm:应该爆炸,但不能保证。您可以在函数中添加“assert(this);”。它在技术上是不合法的,但在你的平台上是有效的。@DavidSchwartz:为什么它在技术上是不合法的?