代码之家  ›  专栏  ›  技术社区  ›  bellotas

在C中检查对象是否为null的最佳做法是什么++

  •  0
  • bellotas  · 技术社区  · 3 年前

    我正在做一个简单的例子。假设我有一个对象 Object my_object 我想检查对象是否为空。

    因此,我实例化了对象:

    auto my_object = createMyObject(param_object_1);
    

    其思想是检查对象是否为null。如果我没有错的话(我真的是C++新手),我已经试过了

    检查引用是否为NULL

    我认为这不是一个选项(即使是编译),因为引用永远不能为NULL,所以我放弃了它。

    EXPECT_TRUE(my_object != NULL);
    

    检查是否!=到nullptr

    我的下一个尝试是检查指向该对象的指针是否为null。

    auto my_object_ptr = std::make_shared<Object>(my_object);
    EXPECT_TRUE(my_object_ptr != nullptr);
    

    这段代码也可以编译,但我不确定这是否是我想要的解决方案。我的意图是检查指针是否指向一个空对象。

    这样做有效吗?如果没有,检查对象是否为空的最佳做法是什么?

    0 回复  |  直到 3 年前
        1
  •  3
  •   Caleth    3 年前

    我想检查对象是否为空。

    祝贺你,你的 Object object 不为null。null不是的可能值 object 未来。

    接近模拟可能是为了测试它是否与默认构造的不同 Object 如果 对象 是默认可构造的。

    EXPECT_TRUE(my_object != Object{})
    
        2
  •  1
  •   zdf    3 年前
    1. nullptr 被称为 空指针文字 。您也可以使用 NULL 0 (zero),但更喜欢nullptr,因为它可以消除一些歧义。
    2. 您可以使用 nullptr 带有指针,但是 没有引用或对象
    3. C++做 默认情况下不初始化指针 所以 int* p; 指向随机地址( 0 包括在内)。
    4. 零位测试 你可以简单地写 if (!p)... if( nullptr == p )... .智能指针的行为方式与裸指针相同,因此您可以用相同的方式测试null。
    5. A. 无效的 指针是 不一定是错误
    6. A. 非null 指针不一定是有效的指针——例如,您忘记初始化它(请参见3)。另一个例子是指向存储持续时间已结束的对象的指针(@user17732522)。
    7. 虽然 参考文献 可以被认为是伪装的指针,语言 强制初始化 ;也就是说,除了这种奇怪的情况之外,它们不能指向随机位置: int& r = r; 这种结构背后的基本原理是与C的向后兼容性(我不知道最新的标准是否改变了这一点)。
        3
  •  0
  •   463035818_is_not_an_ai    3 年前

    对象从不 NULL .参考文献从不存在 NULL std::make_shared 不返回比较等于的共享指针 nullptr ,当解除分配失败时 std::bad_alloc 被抛出。

    检查指针是否 nullptr 你知道

    if ( raw_ptr != nullptr)
    

    检查共享指针存储的指针是否 nullptr 您可以利用转换 bool :

    if ( some_shared_ptr )