在 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
。引用永远不会 NULL
。 std::make_shared
return 不是比较等于 nullptr
的共享指针,当释放失败时 std::bad_alloc
被抛出。
要检查指针是否 nullptr
你需要
if ( raw_ptr != nullptr)
要检查共享指针存储的指针是否不是 nullptr
,您可以使用转换为 bool
:
if ( some_shared_ptr )
nullptr
被称为 空指针文字 。您也可以使用 NULL
或 0
(零),但更喜欢 nullptr,因为它消除了一些歧义。
- 您可以将
nullptr
与指针一起使用,但 不能与引用或对象一起使用。
- C++ 默认不初始化指针。因此,
int* p;
指向一个随机地址(包括 0
)。
- 要针对 null 进行测试,您可以简单地编写
if (!p)...
或 if( nullptr == p )...
。智能指针的行为方式与裸指针相同,因此您可以用相同的方式测试 null。
- 一个 null 指针是 不一定是错误。
- A non-null 指针不一定是有效指针 - 例如,您忘记初始化它(参见 3)。另一个示例是指向存储期限已结束的对象的指针 (@user17732522)。
- 尽管 references 可以被认为是伪装的指针,但是语言 强制初始化 ;也就是说,它们不能指向随机位置——除了这种奇怪的情况:
int& r = r;
。这种构造背后的基本原理是与 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。
Object
的不同之处
EXPECT_TRUE(my_object != Object{})
对象永远不会NULL
。引用永远不会 NULL
。 std::make_shared
return 不是比较等于 nullptr
的共享指针,当释放失败时 std::bad_alloc
被抛出。
要检查指针是否 nullptr
你需要
if ( raw_ptr != nullptr)
要检查共享指针存储的指针是否不是 nullptr
,您可以使用转换为 bool
:
if ( some_shared_ptr )
nullptr
被称为 空指针文字 。您也可以使用NULL
或0
(零),但更喜欢 nullptr,因为它消除了一些歧义。- 您可以将
nullptr
与指针一起使用,但 不能与引用或对象一起使用。 - C++ 默认不初始化指针。因此,
int* p;
指向一个随机地址(包括0
)。 - 要针对 null 进行测试,您可以简单地编写
if (!p)...
或if( nullptr == p )...
。智能指针的行为方式与裸指针相同,因此您可以用相同的方式测试 null。 - 一个 null 指针是 不一定是错误。
- A non-null 指针不一定是有效指针 - 例如,您忘记初始化它(参见 3)。另一个示例是指向存储期限已结束的对象的指针 (@user17732522)。
- 尽管 references 可以被认为是伪装的指针,但是语言 强制初始化 ;也就是说,它们不能指向随机位置——除了这种奇怪的情况:
int& r = r;
。这种构造背后的基本原理是与 C 的向后兼容性(我不知道最新的标准是否改变了这一点)。