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

What is the best practice to check if an object is null in C++

我正在研究一个简单的例子。假设我有一个对象 Object my_object,我想检查该对象是否为 null。

因此,我实例化对象:

auto my_object = createMyObject(param_object_1);

想法是检查对象是否为空。如果我没记错的话(我真的是C++新手),我试过了

检查引用是否为 NULL

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

EXPECT_TRUE(my_object != NULL);

检查 != 是否为 nullptr

我的下一次尝试是检查指向对象的指针是否为空。

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

此代码也可以编译,但我不确定这是否是我正在寻找的解决方案。我的意图是检查指针是否指向空对象。

这是一种有效的方法吗?如果不是,检查对象是否为空的最佳做法是什么?

I want to check if the object is null.

恭喜,您的 Object object 不为空。 null 不是 object 的可能值。

如果 Object 是 default-constructable。

,则可能会测试它与 default-constructed Object 的不同之处
EXPECT_TRUE(my_object != Object{})

对象永远不会NULL。引用永远不会 NULLstd::make_shared return 不是比较等于 nullptr 的共享指针,当释放失败时 std::bad_alloc 被抛出。

要检查指针是否 nullptr 你需要

if ( raw_ptr != nullptr)

要检查共享指针存储的指针是否不是 nullptr,您可以使用转换为 bool:

if ( some_shared_ptr )
  1. nullptr 被称为 空指针文字 。您也可以使用 NULL0(零),但更喜欢 nullptr,因为它消除了一些歧义。
  2. 您可以将 nullptr 与指针一起使用,但 不能与引用或对象一起使用
  3. C++ 默认不初始化指针。因此,int* p; 指向一个随机地址(包括 0)。
  4. 针对 null 进行测试,您可以简单地编写 if (!p)...if( nullptr == p )...。智能指针的行为方式与裸指针相同,因此您可以用相同的方式测试 null。
  5. 一个 null 指针是 不一定是错误
  6. A non-null 指针不一定是有效指针 - 例如,您忘记初始化它(参见 3)。另一个示例是指向存储期限已结束的对象的指针 (@user17732522)。
  7. 尽管 references 可以被认为是伪装的指针,但是语言 强制初始化 ;也就是说,它们不能指向随机位置——除了这种奇怪的情况:int& r = r;。这种构造背后的基本原理是与 C 的向后兼容性(我不知道最新的标准是否改变了这一点)。