2016-06-10 57 views
0

我遇到类似这样的回顾一些代码的东西来的?有人可以解释一些这种用例吗?比较字符串的地址用NULL

+6

除非'string'是一个重载'operator&'的类,条件总是'true'。 – Jarod42

+0

不,字符串是来自STL – redobot

+2

的标准字符串,“跨越类似的东西”或发布实际代码。 –

回答

3

不,你表现的代码,比较不进行任何形式的意识,总是会评估为true。

我大胆猜测:

  • mystring原是char*(也许C代码)。
  • 有人将其盲目地重构为std::string
  • 这导致编译器错误,并使其静音,地址运算符被放置到位。

编辑: 这可能是值得的DoSomething有定睛一看,来确定,如果代码应该检查是否有一个空字符串代替。但是如果代码通过所有测试,我想说,它很可能会被简单地删除。

+0

当OP发布[MCVE]的工作时,没有人会发现我们正在猜测**伪代码的意图吗? –

+1

@sleeptight:我想说,MCVE足以应付(甚至可能是实际的)。如果它不符合OP的实际代码,那是他的问题。但是我已经看到了足够多的类似移植和重构工件,因此我认为它不会很好地反映实际代码。 – MikeMB

2

这是否有意义?

不,它没有任何意义。变量的地址永远不会等于NULL

有人可以解释一下这个用例吗?

也许这是一个尝试检查一个破碎的编译器或代码中的一些UB的健全性。无论如何,我怀疑这会非常有效。

假设编译器没有坏掉,我认为这个条件没有用。这是一个假设,我们大多数人都必须/必须每天都做。


由于H. Guijt的建议,我也觉得合理的,检查是重新理假象所发生的时候累程序员改变了代码使用std::string,而不是一个指针,然后“固定”测试在语法上是正确的,即使它现在没有意义。

+0

编译器是g44 4.8 ...所以我认为这不是原因。所以基本上条件总是正确的,因为地址是nevel NULL,所以DoSomething()将始终执行 – redobot

+0

@redobot肯定是不是唯一的编译器代码将被编译:)是的,你有这个想法。 – user2079303

+0

@redobot破坏的编译器通常用'--disable-bootstrap'(测试编译器是否可以自行编译)或禁用其他内部一致性检查来构建。该版本无关紧要。 –

-1

没有意义。

std :: string mystring;被分配在堆栈中。

所以你正在验证在堆栈中分配的这个变量的地址不为空。这是不可能的,除非有一个奇怪的内存损坏。

https://en.wikipedia.org/wiki/Stack_(abstract_data_type)#Basic_architecture_of_a_stack

+0

就编程语言而言,它不是*“分配在堆栈上”*。它具有自动存储时间或静态存储时间。这是如何实现的,取决于C++的实现。不过,无论哪种方式,它都会在发布的代码段中有一个不同于'nullptr'的地址。 – IInspectable

+1

或甚至动态分配,如果它是一个类的实例的成员,并且该实例是动态分配的。 –

+0

@IInspectable:虽然这是主题。除非我们知道变量的范围,否则我们不能确定它是否被“分配到堆栈上”,我猜'Automatic'有一些东西可以处理'堆栈存储','Global'有一些东西可以处理'static storage' – sameerkn