我们有很多使用原始指针的现有代码,几乎在每次使用时都会进行空检查。
为了更干净地编写更新的代码,我们正在尝试使用工厂构造函数方法和 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/