这是我在使用Valgrind的服务器应用程序中发现的错误。
struct Foo
{
Foo(const std::string& a)
: a_(a_)
{
}
const std::string& a_;
};
使用gcc -Wall你没有得到警告。 为什么这个合法代码?
答案 0 :(得分:2)
你所得到的内容违反了8.3.2/4 A ... reference shall be initialized to refer to a valid object or function
。所以这当然是非法的。
请注意,并非所有错误的程序都需要被编译器检测到,尽管老实说我会认为这是其中之一。
对于它的价值,启用了最大编译器警告的g ++版本4.4.1很高兴地接受了这个程序而没有警告:
int main(void)
{
int *p = 0;
*p = 5;
}
答案 1 :(得分:0)
在C / C ++中允许自我赋值(我认为这是语言中的一个缺陷)。
从内存模型的角度来看,Foo :: a_只是一些内存位置,在初始化列表中,它被分配了另一个内存位置的值,在这种特殊情况下,不幸的是它位于相同的位置。
C中存在类似的缺陷,您可以这样做:
void foo()
{
int i = i;
}