使用Assert和NULL指针验证哪个更好用

时间:2013-01-11 06:49:35

标签: c++ visual-c++ assert

在进行编程时我使用的是assert以及NULL指针验证。

但我知道断言仅在 DEBUG 模式下有用。

我的问题是假设我有一个内部指针我肯定不能为NULL示例函数返回指针(但指针不是类的成员)在这种情况下我可以使用断言 < / p>

test* ptr = fun(); // return a pointer of type test
assert(ptr);

//do some operation

NULL 指针验证

test* ptr = fun(); // return a pointer of type test
assert(ptr);
if (NULL != ptr)
{
    //do some operation
}

这里的代码实践很好。据我所知,它将是第二个。 因为我遇到了一些情况,其中 ptr 的值返回 NULL ,因为我们甚至无法想到一些异常情况。

但我们还有其他更好的选择吗?

5 个答案:

答案 0 :(得分:4)

assert说“如果不是这样,我的代码就会出现逻辑错误”。如果要输入代码来处理指针可能为null的事实,那么断言调用是多余的。您应该在“else”情况下添加日志记录和处理。这样,即使在空指针的情况下,您的调试版本也将以与发布版本相同的方式运行。

如果你的意思是断言,你必须在空指针上中止,然后在你的发布版本中启用断言,或者使用另一种支持发布的断言机制。

仅调试断言的唯一原因是检查在发布代码中过于昂贵的逻辑错误。通常,对指针的空检查不适合此类别。

答案 1 :(得分:3)

真正的解决方案取决于函数fun的语义。

如果返回NULL在语义上无效,那么我认为fun应抛出适当的异常(例如std::logic_error 1 )而不是返回{{1}你可以在调用网站上使用NULL来确保assert正常工作,如果工作不正常,则中止程序。通过这种方式,fun中的错误不会传播到程序的其余部分,因为它会被立即捕获。

但是,如果从fun返回NULL在语义上有效,那么您应该使用fun检查调用网站上的返回值,并且不需要if在这种情况下,因为无论如何你都会使用assert

1。或者您可以使用ifstd::runtime_error

答案 2 :(得分:1)

我建议您使用自己的代码进行断言。 如你所说,断言只能在调试模式下工作。

因此,如果它在发布模式下工作,它就不起作用。

如果您使用自己的断言代码。你可以简单地找出它的错误。

test* ptr = fun(); // return a pointer of type test
MyOwnAssert(ptr); 

void MyOwnAssert(void* pPointer)
{
   if (NULL == pPointer)
     abort();
}    

答案 3 :(得分:0)

正如您所提到的,断言仅在调试期间,帮助程序员识别出错的地方。它在生产中没有任何价值,因此,如果您怀疑指针可能为NULL,我更喜欢使用第二种方法。

答案 4 :(得分:0)

你对断言的看法是你自己的选择:如果你愿意,你可以在生产中使用。

我会说,如果你想尽早发现你的错误,使用assert()会更好。特别是如果不应该发生它是NULL指针的事实 你甚至可以在那里粘贴Google Breakpad,这样每当你点击一个NULL指针时,你就会发送一个包含完整堆栈的报告。

如果可以使用NULL指针(有时候预期......),那么我猜NULL检查更好。但是我会说,在这一点上你的代码是错误的,如果它必须适应传入的NULL指针。