Ast*_*mit 6 c++ assert visual-c++
在进行编程时,我使用的是assert以及NULL指针验证.
但正如我所知,断言仅在DEBUG模式下有用.
我的问题是假设我有一个内部指针,我肯定不能是NULL示例函数返回一个指针(但指针不是类的成员)在这种情况下,我可以使用断言
test* ptr = fun(); // return a pointer of type test
assert(ptr);
//do some operation
Run Code Online (Sandbox Code Playgroud)
或NULL指针验证
test* ptr = fun(); // return a pointer of type test
assert(ptr);
if (NULL != ptr)
{
//do some operation
}
Run Code Online (Sandbox Code Playgroud)
这里的代码实践很好.据我所知,它将是第二个.因为我遇到了一些ptr的值由于某些我们甚至无法想到的异常情况而返回NULL的情况.
但我们还有其他更好的选择吗?
assert说“如果这不是真的,那么我的代码中存在逻辑错误”。如果您放入代码来处理指针可能为空的事实,那么断言调用就是多余的。您应该向“else”情况添加日志记录和处理。这样,即使在空指针的情况下,您的调试构建也将以与发布构建相同的方式运行。
如果您确实指的是断言,并且必须在空指针上中止,则在发布版本中启用断言或使用替代的启用发布的断言机制。
仅调试断言的唯一原因是检查逻辑错误,而在发布代码中执行该逻辑错误的成本太高。通常,指针的空检查不适合此类别。
真正的解决方案取决于函数的语义fun。
如果返回NULL在语义上无效,那么我认为fun应该抛出适当的异常(例如std::logic_error1)而不是返回NULL,并且您可以assert在调用站点上使用以确保fun工作正常,如果工作不正常,则中止程序。通过这种方式,错误fun不会传播到程序的其余部分,因为它会立即被捕获。
但是,如果返回NULLfrom在语义上是有效的,那么您应该使用andfun 来检查调用站点上的返回值,在这种情况下并不是真正需要的,因为无论如何您都会使用。ifassertif
1. 或者您可以使用std::runtime_error或std::domain_error。
| 归档时间: |
|
| 查看次数: |
12391 次 |
| 最近记录: |