在C++中使用带有指针的"assert"

ohy*_*eah 6 c++ assert pointers

我们什么时候需要在C++中使用"assert"指针,当它们被使用时,它们最常被实现?

EMP*_*EMP 13

通常,您将使用断言来检查条件,如果为false,则表示应用程序中存在错误.因此,如果应用程序中的某个点应该遇到NULL指针,除非存在错误,然后断言它.如果由于某些无效输入而遇到它,那么您需要进行适当的错误处理.


pax*_*blo 6

您根本不需要在指针上使用断言。这样做的目的是确保在指针为null时取消对指针的引用时不会崩溃。

您可以这样做,assert但这不是处理此类错误的非常专业的方法,因为它总是会终止程序-如果用户没有保存例如最后三个小时的数据输入,那么这不是一个好主意。

应该对指针执行的操作是检查指针是否为空,并使其正常运行。换句话说,让您的函数返回某种错误或什么都不做(不是每个人都同意这种方法,但是如果有文档记录,这是完全可以接受的)。

assert在我看来,这些东西意味着在开发过程中发现问题,这就是为什么您会发现assert在某些编译器下的发行版本中什么都没做的原因。这是不是对防御性编程的替代品。

关于如何做:

#include <assert.h>
void doSomethingWithPointer (int *p) {
    assert (p != 0);
    cout << *p << endl;
}
Run Code Online (Sandbox Code Playgroud)

最好这样做:

void doSomethingWithPointer (int *p) {
    if (p != 0)
        cout << *p << endl;
}
Run Code Online (Sandbox Code Playgroud)

换句话说,即使您的“合同”(API)声明不允许您接收空指针,您也应该优雅地处理它们。一句老话:对您的奉献要保守,对接受的接受要宽容(解释)。

  • 另一方面,崩溃和丢失用户3个小时的工作比尝试“解决”问题并破坏3星期要好。 (5认同)