【问题标题】:C++ Call a non-virtual non-static method from a null pointer, without accessing members : is this guaranteed to work? [duplicate]C ++从空指针调用非虚拟非静态方法,而不访问成员:这可以保证工作吗? [复制]
【发布时间】:2013-06-21 14:54:11
【问题描述】:

我可以从空指针调用类的非静态、非虚拟方法吗?然后成员函数会测试 this==nullptr 是否为真,如果为真则立即返回。

我知道它在大多数情况下都有效,但这是保证结果吗?这样,我可以确保永远不会发生空指针异常,并避免在调用者代码的许多地方测试空指针。那是为了紧凑,我现在不打算这样做,但我很想知道是否有任何标准可以保证它工作......

谢谢!

【问题讨论】:

  • 不,这是保证未定义的行为。
  • 为什么我们要投票给提出问题清晰的人? Asker 想知道未定义的行为并且正在询问它,它甚至与提议的可能重复的措辞截然不同。
  • 文章:还在比较“this”指针是否指向 Null? - viva64.com/en/b/0226
  • @Sqeaky - 另外,它的 2014 年和标准已经过修订。因此,以前的答案甚至可能不适用。它的经典 Could we please be a bit nicer to new users? 上面点缀着一点“我比你知道的多”。

标签: c++ function pointers null member


【解决方案1】:

取消引用nullptr未定义的行为。期间!
它是否适用于一个特定的实现是无关紧要的,行为是无法保证的。

【讨论】:

  • 我喜欢权威:)
  • 虽然我同意你的回答,而且问题是关于“保证”的行为:在现实生活中它可以工作一段时间,如果你必须处理一些依赖于这些东西的代码(或更多UB的复杂案例),“期间!”之后有很多细节......
  • 说明。请引用您的参考资料!否则无法保证相信答案。
  • @galinette:这是最常见且基本已知的未定义行为用例。如果你不知道这个基本事实,那么你就急需一本好书。不,我不会为这种微不足道的案件召唤神圣的标准。
  • @anxieux:一旦 UB 发生,从标准的角度来看,行为是未定义的,因此试图找到有意义的结论是没有意义的,尤其是在没有提及特定编译器实现的情况下。
【解决方案2】:

标准明确提到取消引用 NULL 指针是未定义的行为。使用操作符 -> 取消引用向左的指针。

所以只有在你的实现定义某种行为的情况下你才可以,因为这是一种可能性(尽管我在现实生活中从未遇到过)。

(我希望你明白,观察某事不等于被定义。)

【讨论】:

    【解决方案3】:

    始终避免调用空指针, 你通常会得到一个核心转储

    【讨论】:

    • 我肯定会避免它......事实上,知道成员函数的机制('this' 只是作为隐藏的第一个参数传递给其他静态函数),我只是想知道如何行为在标准中定义。
    【解决方案4】:

    这里有有趣的答案: When does invoking a member function on a null instance result in undefined behavior?

    此外,该标准没有提示调用成员虚函数的机制。它通常通过将“this”作为隐藏函数参数传递来完成,这实际上不会取消引用指针并起作用。但是,似乎可以使用 vtable 实现非虚拟功能,在这种情况下会崩溃。

    有趣的是,Microsoft 函数依赖于这种行为 :) http://msdn.microsoft.com/en-us/library/d64ehwhz%28v=vs.80%29.aspx

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 2012-07-26
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 2013-08-25
      • 1970-01-01
      • 2012-09-08
      相关资源
      最近更新 更多