<Struct at NULL> 和 "Struct is null" 一样吗?

Is <Struct at NULL> the same as "Struct is null"?

在 Visual Studio 中,BuildVision 给我一个错误,消息是 < Struct at Null>

和"Struct is Null"是一样的还是不一样的?

我之所以提问,是因为我在网上找不到任何与此消息相关的内容。我能找到的所有内容都指向 "Struct is Null",但我找到的所有内容都没有帮助我!我想知道这是不是因为 at?

编辑:

我用 -Stuff 添加了调试器 window 的屏幕截图。我还有第二个问题:我想用 if-else 子句捕获这个异常。我怎么说

if(value == <struct at NULL>)
    this()
else
    that()

这是行不通的,尽管调试器说该值是 .

在此示例中,我尝试检查 "distribution" 的组件是否为空以确定 Distribution 对象的状态。这是原始代码:

if (Distribution.distBrowserName() == NULL || Distribution.getShape() == NULL)
        return false;
    else 
        return true;

(晚了三个月,但这是我的热门搜索结果。希望我能帮助别人。)

回答您的第一个问题:是的,<struct at NULL> 表示对对象(结构或class)的引用为空。这条消息可能会出现一个悬垂的引用,就像你的情况一样。它也可以与 dangling/null 指针一起出现。

因此,对于您的第二个问题,是您示例中对 Distribution 对象本身的引用导致了问题,因此您可能正在某处寻找悬空引用。

人们经常忽视的 MSVS 中一个有用的功能是数据断点。如果您不熟悉它们,可以 read about them here。例如,在这种情况下,它可以帮助您追踪 Distribution 变量是否在您未预料到的某个地方受到影响。

我最近也遇到了这个问题。在我的例子中,它是由通过取消引用空指针初始化的引用引起的。基本上是这样的:

Foo * fooPtr = nullptr;
// ...
Foo & fooRef = *fooPtr;
// ...
fooRef.Bar() // read access violation

即使在第三行抛出异常,问题实际上出在第二行,因为取消引用空指针是未定义的行为。在这里,它创建了一个无效对象的引用,Visual Studio 调试器将其表示为 <Struct at NULL>。尝试访问此无效对象的成员会导致读取访问冲突。

如果你还想验证一个引用是否是<Struct at NULL>,你可以通过比较它的地址和null来完成:

if (&fooRef != nullptr)
{
    fooRef.Bar();
}

以下是关于无效引用的其他一些有趣问题:

Is null reference possible?

Why don't I need to check if references are invalid/null?