c++ - 在大型 C++ 代码库中避免空指针异常

标签 c++ null nullpointerexception

我继承了一个大型 C++ 代码库,我的任务是避免代码库中可能发生的任何空指针异常。是否有可用的静态分析工具,我想是 lint,您已经成功使用了。

您还注意哪些其他事项?

最佳答案

您可以从消除 NULL 的来源开始:

改变

if (error) {
    return NULL;
}

进入

if (error) {
    return DefaultObject; // Ex: an empty vector
}

如果返回默认对象不适用并且你的代码库已经使用了异常,那么做

if (error) {
    throw BadThingHappenedException;
}

然后,在适当的地方添加处理。

如果您正在使用遗留代码,您可以创建一些包装函数/类:

ResultType *new_function() {
    ResultType *result = legacy_function();
    if (result) {
        return result;
    } else {
        throw BadThingHappenedException;
    }
}

新功能应该开始使用新函数并有适当的异常处理。

我知道有些程序员就是不会得到异常,包括像 Joel 这样的聪明人.但是,返回 NULL 最终发生的是这个 NULL 像疯了似的传递,因为每个人都会认为处理它并默默地返回不是他们的事。有些函数可能会返回错误代码,这很好,但调用者通常最终会返回另一个 NULL 来响应错误。然后,您会在每个函数中看到很多 NULL 检查,无论该函数多么微不足道。而且,只需要一个不检查 NULL 的地方就会使程序崩溃。异常会迫使您仔细考虑错误并准确决定应该在何处以及如何处理它。

您似乎只是在寻找简单的解决方案,例如静态分析工具(您应该始终使用)。更改指向引用的指针也是一个很好的解决方案。然而,C++ 具有 RAII 的优点,它消除了“try {} finally {}”无处不在的需要,因此我认为它值得您认真考虑。

关于c++ - 在大型 C++ 代码库中避免空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1180832/

相关文章:

java - 仅在没有检查的情况下,空对象模式是否有意义?

null - PHP 回显 `null` 值

java - String.isEmpty() 持续出现 java.lang.NullPointerException 错误

java - 使用JPA持久化时是否需要设置实体类的所有字段?

java - 尝试打印邮件消息时出现 NullPointerException

c++ - 无法在 Qt C++ 程序中加载 qrc 文件

c++ - boost::spirit char/string 混合

c++ - 查找以 2 为底的对数向上舍入为整数,与向上舍入到 2 的幂并查找最高设置位相同吗?

gdb 中的 C++ static_cast 返回与 gcc 不同的结果

xna - Kinect Null Depth 和 Color Frame