Плохой поиск в LMDB Получить?

Я использую базу данных 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», он объединяет мусор после нулевого символа строки.

1

Решение

Проблема в этой строке:

return (char *)data.mv_data;

Так как data.mv_data на самом деле это просто набор байтов, а не строка с нулевым символом в конце. Если вы просто бросили его char* Вы можете получить мусор в конце строки.

Решение состоит в том, чтобы скопировать data.mv_size bytes от data.mv_data недавно выделенному char*, Кроме того, вы можете передать указатель назначения в виде out параметр вашего Get метод.

По крайней мере, это мое решение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]