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で終わる文字列です:
あなたは正しいです、その行を次のように変更しました:std :: string str((char *)data.mv_data、data.mv_size);それは今働いています。 –