c++ lambda表达式问题

浏览:22日期:2023-05-04

问题描述

下面这段代码在ubuntu g++ 4.6.3 可以正常运行,在g++ 5.2 中运行正常。但是在centos g++ 4.8.5中运行失败,但是把lambda表达式注释之后就可以正常运行,这个和编译器有关吗?

// 这是一个工具类class ScopeGuard{public: explicit ScopeGuard(std::function<void ()> onExitScope) :onExitScope_(onExitScope) { } ~ScopeGuard() {onExitScope_(); }private: std::function<void ()> onExitScope_;};

下面程序是用来解压的程序,但是在centos中会解压失败。

// 上面还有类似的几个lambda表达式 int dstLen = 10 * 1024 * 1024; char *dstBuf = new char[dstLen];// 把下面一行注释掉就可以正确解压,只要函数内有一个这样的表达式就会解压失败 ScopeGuard guard([&](){if (dstBuf) delete[] dstBuf; dstBuf=NULL;});// src 是解压前的数据,fileLen是数据长度 int err = uncompress((Bytef *)dstBuf, (uLongf*)&dstLen, (Bytef*)src, fileLen); if (err != Z_OK) {cout<<'uncompress error...'<<err<<endl;return false; }

请问,是我的lambda方式用错了还是编译器的bug?

问题解答

回答1:

解压失败的返回值是啥?lambda支持感觉这个应该没有问题,gcc 4.5开始支持lambda,gcc 4.8.5已经算是比较稳定的版本了,编译器的bug应该是最后考虑的事情...

回答2:

在guard对象析构的时候会调用[&](){if (dstBuf) delete[] dstBuf; dstBuf=NULL;}你这里说的解压失败,是指uncompress函数返回不是Z_OK这样吗?还是说程序会出别的问题?

还有就是[&]()mutable -->void {if (dstBuf) delete[] dstBuf; dstBuf=NULL;}这样才能修改dstBuf吧。这个我没有做测试,不知道是不是。

回答3:

关于ScopeGuard的实现,你可以参考 Andrei Alexandrescu在facebook开源的folly库中的实现

https://github.com/facebook/folly/blob/master/folly/ScopeGuard.h

相关文章: