使用断言和 NULL 指针验证什么更好
Use of Assert and NULL pointer validation what's better to use
在编程时,我使用断言和NULL指针验证。
但正如我所知,assert只有在调试模式下才有用。
我的问题是,假设我有一个内部指针,我确信它不能为NULL。例如,函数返回指针(但指针不是类的成员(。在这种情况下,我可以使用assert
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,这是由于一些我们甚至无法想到的异常情况。
但我们还有其他更好的选择吗?
assert
表示"如果这不是真的,那么我的代码中存在逻辑错误"。如果您正在放入代码来处理指针可能为null的事实,那么断言调用是多余的。您应该将日志记录和处理添加到"else"情况中。这样,调试构建将以与发布构建相同的方式运行,即使在空指针的情况下也是如此。
如果您的意思是断言,并且必须在空指针上中止,那么在您的发布版本中启用断言,或者使用另一种启用发布的断言机制。
只进行调试断言的唯一原因是检查逻辑错误,该错误的成本太高,无法在发布代码中生成。通常情况下,指针的空检查不属于此类。
真正的解决方案取决于函数fun
的语义。
如果返回NULL
在语义上无效,那么我认为fun
应该抛出一个适当的异常(例如std::logic_error
1(,而不是返回NULL
,并且可以在调用站点上使用assert
来确保fun
正常工作,如果不正常,则中止程序。通过这种方式,fun
中的错误不会传播到程序的其余部分,因为它会立即被捕获。
但是,如果从fun
返回NULL
在语义上是有效的,那么您应该使用if
在调用站点上检查返回值,而在这种情况下并不需要assert
,因为您无论如何都会使用if
。
1。或者您可以使用std::runtime_error
或std::domain_error
我建议您使用自己的代码进行断言。正如您所说,assert只在调试模式下工作。
所以,如果它在发布模式下工作,它就不起作用。
如果您使用自己的断言代码。你可以简单地找出问题所在。
test* ptr = fun(); // return a pointer of type test
MyOwnAssert(ptr);
void MyOwnAssert(void* pPointer)
{
if (NULL == pPointer)
abort();
}
正如您所提到的,assert只在调试期间进行,可以帮助程序员确定哪里出了问题。它在生产中没有价值,因此,如果您怀疑指针可能为NULL,我更喜欢使用第二种方法。
断言是您自己的选择:如果您愿意,可以在生产中使用is。
我想说,如果你想尽早发现错误,使用assert((会更好。特别是如果它是一个NULL指针这一事实不应该发生的话
你甚至可以在那里粘贴一个Google Breakpad,这样每当你点击一个NULL指针时,你就会发送一个完整堆栈的报告。
在可能出现NULL指针的情况下(有时需要…(,我想NULL检查会更好。但我想说,在这一点上,如果你的代码必须适应传递的NULL指针,那么它在某种程度上是错误的。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- 此代码验证公式是什么意思?
- RSA_verify中预期的数据类型是什么,无法验证从 Java 生成的签名
- mfc CEdit 我应该什么时候进行验证?
- 解析 HTTP 的摘要式身份验证的正确正则表达式模式是什么?
- 验证给定C++编译器是否将源代码读取为 C++11 的快速简单代码是什么?
- 验证加载的DLL是否具有有效证书的最安全方法是什么
- 已知的最有效的尾递归素数验证函数是什么?
- 在 Win32 中验证 SSL 证书的正确方法是什么?
- 验证输入的好方法是什么?
- 使用断言和 NULL 指针验证什么更好