我对c ++中的lambda感到困惑。它与编译器有关吗? 以下代码在ubuntu g ++ 4.6.3和g ++ 5.2中运行正确。但是当我在centos 4.8.5中运行它时,结果是错误的。
//
class ScopeGuard
{
public:
explicit ScopeGuard(std::function<void ()> onExitScope)
:onExitScope_(onExitScope)
{
}
~ScopeGuard()
{
onExitScope_();
}
private:
std::function<void ()> onExitScope_;
};
还有一个解压缩数据的功能。
//
...
int dstLen = 10 * 1024 * 1024;
char *dstBuf = new char[dstLen];
// When I comment this line the err return Z_OK, otherwise return Z_BUFF_ERROR.
ScopeGuard guard([&](){if (dstBuf) delete[] dstBuf; dstBuf=NULL;});
// zlib function.
int err = uncompress((Bytef *)dstBuf, (uLongf*)&dstLen, (Bytef*)src, fileLen);
if (err != Z_OK)
{
cout<<"uncompress error..."<<err<<endl;
return false;
}`
答案 0 :(得分:1)
这很可能是因为:int
。
uLongf
是unsigned long
,它是32位且是所有当前的典型系统。但是,int*
是uLongf*
的别名,在Windows和32位* nix系统上为32位,在64位* nix系统上为64位。
将dstLen
强加给uLongf
是不安全的,也可能做错了。
解决方案是让greenify
成为function
并删除演员。