2017-01-19 9 views
1

私のプロジェクトでlmdbデータベースを使用していますが、lmdbのmdb_get関数を使用してデータを取得する際に問題があります... mdb_putが正常に機能していると確信していますが、get関数はデータでガーベッジを連結します...LMDBで不正な取得を取得しますか?

std::string Get(std::string key) 
{ 
    int rc=0; 
    char *c_key=(char *)key.c_str(); 
    MDB_val d_key,data; 
    data.mv_data = nullptr; 
    data.mv_size = 0; 
    MDB_txn *txn = nullptr; 
    rc = mdb_txn_begin(env_, NULL,MDB_RDONLY, &txn); 
    rc = mdb_dbi_open(txn,NULL, 0, &dbi_); 
    d_key.mv_size = key.size(); 
    d_key.mv_data = c_key; 
    rc= mdb_get(txn,dbi_,&d_key,&data); 
    if (rc) { 
    std::cout<<"Data Can't be Found, Error: "<<mdb_strerror(rc); 
    mdb_dbi_close(env_,dbi_); 
    return ""; 
    } 
    else if(rc==0) 
     std::cout<<"Data Found.\n"; 
    mdb_dbi_close(env_,dbi_); 
    return (char *)data.mv_data; 
} 

返されたstrには、たとえば "str"に "w ah n"が含まれている必要がありますが、mdb_getが "w ah n \ 0004"を返すと、文字列null文字の後にガベージが連結されます。

return (char *)data.mv_data; 

data.mv_dataので、実際にちょうどバイトの束ではないNULLで終わる文字列です:

答えて

1

問題は、このラインです。 char*にキャストすると、文字列の最後にガベージが表示されます。

解決策は、data.mv_dataから新たに割り当てられたchar*にコピーすることです。または、宛先ポインタをGetメソッドのoutパラメータとして渡すこともできます。

少なくともこれが私のソリューションです。

+0

あなたは正しいです、その行を次のように変更しました:std :: string str((char *)data.mv_data、data.mv_size);それは今働いています。 –

関連する問題