所以,我刚刚完成了一个大型服务器应用程序的耗时数小时的艰苦调试会话。该错误最终归结为构造函数中几乎不明显的错字。基本上,它是这样的:
template <class T>
class request_handler
{
public:
request_handler(T& request, Log& error_log)
: m_request(m_request), m_error_log(error_log)
{
/*... some code ... */
}
...
};
看到错误了吗?好吧,我没有。问题是初始化列表中的一个小错字:m_request(m_request)
正在为自己分配一个未初始化的引用。显然,它应该读取m_request(request)
.
现在,成员变量m_request
的类型为T&
。那么 - 编译器是否有某种原因没有警告我我在这里使用了未初始化的变量?
使用带有-Wall
标志的 GCC 4.6,如果我说:
int x;
x = x;
...它会发出警告:warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
那么,为什么当我分配m_request
给自己时编译器没有警告我:本质上是给自己分配一个未初始化的引用?它会为我节省数小时的烦恼。