2017-01-19 5 views
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에 "w ah n"이 포함되어야하지만 반환 된 mdb_get이 "w ah n \ 0004"를 반환하면 문자열 null 문자 다음에 가비지가 연결됩니다.

return (char *)data.mv_data; 

data.mv_data 때문에 실제로 단지 바이트 무리하지 null로 끝나는 문자열입니다

답변

1

문제는이 라인입니다. char*으로 전송하면 문자열 끝 부분에서 가비지를 얻을 수 있습니다.

해결 방법은 data.mv_data에서 새로 할당 된 char*으로 복사하는 것입니다. 해결 방법은 data.mv_size bytes입니다. 또는 Get 메서드의 out 매개 변수로 대상 포인터를 전달할 수 있습니다.

적어도 이것은 내 해결책입니다.

+0

맞습니다. 해당 행을 다음과 같이 변경했습니다. std :: string str ((char *) data.mv_data, data.mv_size); 그리고 지금 일하고있다. –