我在我的项目上运行PREfast静态代码分析,它给了我这个模式的C6001 'using uninitialized memory‘错误:
// AutoSelectGDIObject is a class
if (AutoSelectGDIObject & select_image = AutoSelectGDIObject(hDCImgSource, hBmp))
{
// use hDCImgSource knowing that hBmp is selected into it
}
// now we are guaranteed that hDCImgSource has had hBmp removed and its previous bmp re-selected into itself我试图利用的技巧是允许表达式的作用域仅限于if表达式(即if( select_image ){表达式块=条件变量的生存期} )。
VS在相当长的一段时间里一直在愉快地编译(并可能会运行这段代码)。我很久没有像这样的单步执行代码了,但据我所知,只有当select_image的操作符bool()返回true时,它才会进入if块,并且在退出if块时,它会销毁select_image的实例。
PREfast错了吗?还是有什么微妙的地方使得我上面的代码和假设是不正确的?
发布于 2013-04-17 22:35:59
是不是PREfast错了?还是有什么微妙的地方使得我上面的代码和假设是不正确的?
该代码是无效的C++,但是VC编译了它,因为它允许将对非const-qualified类型的左值引用绑定到临时变量。
在我看来,这是一个愚蠢的扩展。根据C++标准,临时函数只能绑定左值引用到const或右值引用(在这种情况下,它们的生命周期被延长到创建它们的完整表达式的末尾)。
因此,您的if语句应该是:
if (AutoSelectGDIObject const& select_image =
// ^^^^^
AutoSelectGDIObject(hDCImgSource, hBmp))例如,请参阅此。
但是,请注意,这里根本不需要使用引用。换句话说,下面的if语句也是有效的,它比创建到const的左值引用的临时绑定更好地表达了您的意图
if (AutoSelectGDIObject select_image = AutoSelectGDIObject(hDCImgSource, hBmp))例如,请参阅此。此外,上面的代码还允许您修改select_image,而对const的引用不允许。
https://stackoverflow.com/questions/16062847
复制相似问题