在进行编程时我使用的是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 ,因为我们甚至无法想到一些异常情况。
但我们还有其他更好的选择吗?
答案 0 :(得分:4)
assert
说“如果不是这样,我的代码就会出现逻辑错误”。如果要输入代码来处理指针可能为null的事实,那么断言调用是多余的。您应该在“else”情况下添加日志记录和处理。这样,即使在空指针的情况下,您的调试版本也将以与发布版本相同的方式运行。
如果你的意思是断言,你必须在空指针上中止,然后在你的发布版本中启用断言,或者使用另一种支持发布的断言机制。
仅调试断言的唯一原因是检查在发布代码中过于昂贵的逻辑错误。通常,对指针的空检查不适合此类别。
答案 1 :(得分:3)
真正的解决方案取决于函数fun
的语义。
如果返回NULL
在语义上无效,那么我认为fun
应抛出适当的异常(例如std::logic_error
1 )而不是返回{{1}你可以在调用网站上使用NULL
来确保assert
正常工作,如果工作不正常,则中止程序。通过这种方式,fun
中的错误不会传播到程序的其余部分,因为它会被立即捕获。
但是,如果从fun
返回NULL
在语义上有效,那么您应该使用fun
检查调用网站上的返回值,并且不需要if
在这种情况下,因为无论如何你都会使用assert
。
1。或者您可以使用if
或std::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指针。