gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:25:37 25 4
gpt4 key购买 nike

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

为了更干净地编写更新的代码,我们正在尝试使用工厂构造函数方法和 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com