2011-07-06 20 views
0

zlibを使用して文字列を圧縮したい。私が約1時間後にこの関数をループすると、 "compress"は-4を返します。これはZ_MEM_ERRORを意味します。誰が問題がどこにあるのか知っていますか?私が見ることができるzlibのメモリ不足問題​​

std::string compressData(std::string const& line) 
{ 

    char *src=(char*)line.c_str(); 
    int srcLen=strlen(src); 

    int destLen=compressBound(srcLen); 
    char *dest=new char[destLen]; 

    int result=compress((unsigned char *)dest ,(uLongf*)&destLen ,(const unsigned char *)src ,srcLen); 

    QByteArray sd = QByteArray::fromRawData(dest, destLen); 
    QString hexZipData (sd.toHex()); 
    std::string hexZipDataStr = hexZipData.toStdString(); 

    if(result != Z_OK) 
    { 
     hexZipDataStr = ""; 
     std::cout << "error !"; 
    } 

    delete []dest; 
    dest = NULL; 

    return hexZipDataStr; 
} 
+0

'char * src =(char *)line.c_str();' - >これをしないでください。 c_str()はconst-charへのポインタを返しますので、constをキャストしています。 C++キャスト(この場合はstatic_cast <>)を使用していたなら、コンパイラはあなたに警告することができました。 (これはあなたの問題の理由ではありませんが) –

+0

あなたは最小限の完全な例を投稿できますか?私はqtがここで余分だと思います。 –

+0

再度:C++キャストを使用します。おそらく、あなたは互換性のないポインタを変換します。 '(uLongf *)&destLen' < - なぜあなたはdestLenをuLongfとして宣言しませんか? –

答えて

0

のみ不審な場所は、あなたがあなたのint destLenタイプuLongfの出力パラメータとして供給することです。 uLongfintより大きい場合はスタックが爆発する可能性があり、64ビットプラットフォームでは「長い」部分がそうであることが示唆されます。

私はすぐにタイプuLongfdestLenを宣言し、キャストを避けるために、あなたをお勧めします。

それ以外では、コードに問題はありません。