c++ - LMDB Get 中的错误检索?

标签 c++ database caffe lmdb

我在我的项目中使用 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 实际上只是一堆字节,而不是一个以 null 结尾的字符串。如果您只是将它转换为 char*,您可能会在字符串末尾得到垃圾。

解决方案是将data.mv_size字节data.mv_data复制到新分配的char*。或者,您可以将目标指针作为 Get 方法的 out 参数传递。

至少这是我的解决方案。

关于c++ - LMDB Get 中的错误检索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41739283/

相关文章:

c++ - 运行 SDL2 时 Xcode 崩溃

c++ - 构造对象两次

c++ - 使用 Boost.regex 从目录打印 .pdf 文件名

c++ - 检查整数类型是否适合可能不同(整数)类型的值的函数

mysql - 如何执行这个 GROUP BY mysql 查询?

machine-learning - Caffe中Tiling层的用途是什么

sql-server - 用于 SQL Server 的 MySQL Workbench?

sql - 有没有办法替代 GROUP BY

python - 找不到模块

machine-learning - Caffe 中的多标签回归