2016-06-02 4 views
0

Я чувствую смущение о лямбда в C++. Связано ли это с компилятором? Следующий код работает правильно в ubuntu g ++ 4.6.3 и g ++ 5.2. Но когда я запускаю его в centos 4.8.5, результатом является ошибка.C++ лямбда выражение замешательство

// 
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

Возвращаемое значение функции uncompress - Z_BUFF_ERR только при запуске кода в centos g ++ 4.8.5. когда я аннотирую ScopeGuard, он возвращает Z_OK. – MiJia

+1

Кроме того, CentOS не является компилятором; каков фактический компилятор и его версия? –

+0

Когда я запускаю centos с gcc версии 4.8.5, результатом является ошибка. – MiJia

ответ

1

Это, скорее всего, из-за этого: (uLongf*)&dstLen.

dstLen является int, который представляет собой 32 бита и все существующие типовые системы. uLongf, однако, является псевдонимом для unsigned long, который представляет собой 32 бита в Windows и 32-разрядных системах * nix, но 64 бит в 64-битных * nix-системах.

Это небезопасно и, скорее всего, поступит не так, чтобы отличить int* с номером uLongf*.

Решение должно сделать dstLen a uLongf и удалить литой.

+0

Да, большое спасибо! Я решил проблему с этим методом. – MiJia

+0

ubuntu - 32-разрядный, но centos - 64-разрядный – MiJia

Смежные вопросы