[英]Bad Retrieval in LMDB Get?
我在我的項目中使用 lmdb 數據庫,我在使用 lmdb 的 mdb_get 函數檢索數據時遇到問題......我確定 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*
。 或者,您可以將目標指針作為Get
方法的out
參數傳遞。
至少這是我的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.