c++ - 从工厂方法返回的 const unique_ptr 不需要空检查吗?

标签 c++ c++11 unique-ptr

我们有很多使用原始指针的现有代码,几乎在每次使用时都会进行空检查。

为了更干净地编写更新的代码,我们正在尝试使用工厂构造函数方法和 unique_ptrs。

我的问题是,在下面的代码中,一旦我们获得了工厂创建的对象 - sensorX - 我们是否可以在其余代码中使用它而不对其进行进一步的 null 检查,因为它是一个 const unique_ptr?

设备工厂.h

class DeviceFactory
{
public:

    template<typename T>
    static unique_ptr<T> create(int id, std::string status)
    {
        auto device = unique_ptr<T>{ new T{ id, status } };

        if (!device) throw DeviceCreationException("device couldn't be created");

        return device;
    }
};

用法

const auto sensorX = DeviceFactory::create<Sensor>(123, "sensorX");

最佳答案

看起来您使用不太灵活的 API 编写了自己的 std::make_unique 版本。我建议调整 API,因为这会使升级更容易。

也就是说,您的问题是关于空值检查的。正如评论中多次指出的那样,您不需要在获得指针后进行检查,因为应该抛出 std::bad_alloc 。但是,让我们假设您进行了另一次抛出此类自定义异常的检查,而不是主要问题是:您的 API 是什么,包括前置条件和后置条件。

在我们工作的代码库中,除非有记录,否则 std::unique_ptr 不允许为 nullptr。在那种情况下:不需要空检查。您可以将其记录为 nullptr,或者返回一个可选值,这可能指示无效状态。

我的习惯是在使用前或创建后对指针进行断言。但是,您可以使用 Clang/Gcc 的 sanitizer 来自动执行该工作。 GSL 还可以检查此 nullptr 用法。

我的建议:在创建变量(或使用 sanitizer )后断言,如果后置条件发生变化,应该在测试期间找到错误。与你的大学一起,你应该同意 unique_ptr 不应该被允许包含 null 除非记录 nullptr 代表什么。

关于c++ - 从工厂方法返回的 const unique_ptr 不需要空检查吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55533716/

相关文章:

c++ - 使用 emplacement 构造一个大小不变的矩阵 vector

c++11 - 在 LLVM/Clang 下编译时,命名空间 'unique_ptr' 中没有名为 'std' 的类型

c++ - 在 C++ 中为父类数据数组提供别名

c++ - Lambda 以迭代器为参数

c++ - 使用相同的 unique_ptr 执行 std::move 两次

c++ - 具有智能指针的非虚拟删除器

c++ - C 与 C++ 为什么这个宏不扩展为常量?

c++ - Halide Jit 编译

c++ - SDL Mix_LoadMUS 未加载 .mp3

c++ - 何时在函数调用中使用 move