c ++ lambda表达混淆

时间:2016-06-02 11:50:15

标签: c++11 lambda

我对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;
}`

1 个答案:

答案 0 :(得分:1)

这很可能是因为:int

uLongfunsigned long,它是32位且是所有当前的典型系统。但是,int*uLongf*的别名,在Windows和32位* nix系统上为32位,在64位* nix系统上为64位。

dstLen强加给uLongf是不安全的,也可能做错了。

解决方案是让greenify成为function并删除演员。