gpt4 book ai didi

c++ - Nullptr 并检查指针是否指向有效对象

转载 作者:IT老高 更新时间:2023-10-28 12:32:17 33 4
gpt4 key购买 nike

在我从未听说过智能指针的几个旧代码项目中,每当我需要检查指针是否仍然指向有效对象时,我总是会做这样的事情......

object * meh = new object;
if(meh)
meh->member;

或者当我需要安全地删除对象时,像这样

if(meh)
{
delete meh;
meh = 0;
}

好吧,现在我已经了解了在 bool 表达式中使用对象和指针可能会出现的问题,这两者都带有文字数字,很难:。现在,我还了解了 C++ 的一个不太新但非常酷的特性,即 nullptr 关键字。但现在我很好奇。

我已经完成并修改了大部分代码,例如,在删除我现在编写的对象时

if(meh)
{
delete meh;
meh = nullptr;
}

现在我想知道 bool 值。当你将一个 int 传递给这样的 if 语句时,

int meh;
if(meh)

然后它会隐式检查零,而无需您编写它。

if(meh == 0) // does the exact same check

现在,C++ 会为指针做同样的事情吗?如果将这样的 char * 传递给 if 语句?

char * meh;
if(meh)

那么它会隐含地把它和nullptr 比较吗?由于我已经像这样编写这些 if 有多久了,此时通过键入 if (object *) 然后调用其成员来检查指针是否在使用之前有效是第二天性。如果这不是功能,为什么不呢?实现起来太难?将通过删除另一种可能会弄乱代码的小方法来解决一些问题。

最佳答案

在 C 中,任何不为 0 的都是真的。所以,你当然可以使用:

if (ptrToObject) 
ptrToObject->doSomething();

安全地取消引用指针。

C++11 稍微改变了游戏,nullptr_t 是一个类型,nullptr 是一个实例; nullptr_t 的表示是特定于实现的。因此,编译器可以根据需要定义 nullptr_t。它只需要确保它可以对将 nullptr_t 强制转换为不同类型(其中 boolean 是允许的)强制实现适当的限制,并确保它可以区分nullptr_t 和 0.

因此,只要编译器遵循 C++11 语言规范,nullptr 就会正确且隐式地转换为 boolean false。上面的代码段仍然有效。

如果删除引用的对象,则不会发生任何变化。

delete ptrToObject;
assert(ptrToObject);
ptrToObject = nullptr;
assert(!ptrToObject);

Because of how long I have been writing these ifs like this, it is second nature at this point to check if the pointers valid before using by typing if (object *) and then calling it's members.

否。请保持正确的对象图(最好使用唯一/智能指针)。正如所指出的,没有办法确定不是 nullptr 的指针是否指向有效对象。无论如何,您有责任维护生命周期。这就是指针包装器首先存在的原因。

事实上,因为 shared 的生命周期和 weak指针定义明确,它们具有语法糖,让您可以按照您希望使用裸指针的方式使用它们,其中有效指针有一个值,而所有其他指针都是 nullptr:

共享

#include <iostream>
#include <memory>

void report(std::shared_ptr<int> ptr)
{
if (ptr) {
std::cout << "*ptr=" << *ptr << "\n";
} else {
std::cout << "ptr is not a valid pointer.\n";
}
}

int main()
{
std::shared_ptr<int> ptr;
report(ptr);

ptr = std::make_shared<int>(7);
report(ptr);
}

#include <iostream>
#include <memory>

void observe(std::weak_ptr<int> weak)
{
if (auto observe = weak.lock()) {
std::cout << "\tobserve() able to lock weak_ptr<>, value=" << *observe << "\n";
} else {
std::cout << "\tobserve() unable to lock weak_ptr<>\n";
}
}

int main()
{
std::weak_ptr<int> weak;
std::cout << "weak_ptr<> not yet initialized\n";
observe(weak);

{
auto shared = std::make_shared<int>(42);
weak = shared;
std::cout << "weak_ptr<> initialized with shared_ptr.\n";
observe(weak);
}

std::cout << "shared_ptr<> has been destructed due to scope exit.\n";
observe(weak);
}

Now, will C++ do the same for pointers? If pass in a char * like this to an if statement?

所以回答这个问题:用 bare 指针,没有。使用 wrapped 指针,

各位,总结一下。

关于c++ - Nullptr 并检查指针是否指向有效对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11279715/

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