Я использую базу данных lmdb в своем проекте, у меня проблема с получением данных с помощью функции mdb_get в lmdb … Я уверен, что mdb_put работает правильно, но функция get объединяет некоторые данные с моими данными …
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», он объединяет мусор после нулевого символа строки.
Проблема в этой строке:
return (char *)data.mv_data;
Так как data.mv_data
на самом деле это просто набор байтов, а не строка с нулевым символом в конце. Если вы просто бросили его char*
Вы можете получить мусор в конце строки.
Решение состоит в том, чтобы скопировать data.mv_size bytes
от data.mv_data
недавно выделенному char*
, Кроме того, вы можете передать указатель назначения в виде out
параметр вашего Get
метод.
По крайней мере, это мое решение.
Других решений пока нет …