* ---编辑 - 现在整个过程*
当我在最后调试它时,“get”和“value”具有不同的值!也许,我转换为void *并以错误的方式返回User?
#include <db_cxx.h>
#include <stdio.h>
struct User{
User(){}
int name;
int town;
User(int a){};
inline int get_index(int a){
return town;
} //for another stuff
};
int main(){
try {
DbEnv* env = new DbEnv(NULL);
env->open("./",
DB_CREATE | DB_INIT_MPOOL | DB_THREAD |
DB_INIT_LOCK | DB_INIT_TXN | DB_RECOVER | DB_INIT_LOG, 0);
Db* datab = new Db(env, 0);
datab->open(NULL, "db.dbf", NULL, DB_BTREE, DB_CREATE | DB_AUTO_COMMIT, 0);
Dbt key, value, get;
char a[10] = "bbaaccd";
User u;
u.name = 1;
u.town = 34;
key.set_data(a);
key.set_size(strlen(a) + 1 );
value.set_data((void*)&u);
value.set_size(sizeof(u));
get.set_flags(DB_DBT_MALLOC);
DbTxn* txn;
env->txn_begin(NULL, &txn, 0);
datab->put(txn, &key, &value, 0);
datab->get(txn, &key, &get, 0);
txn->commit(0);
User g;
g = *((User*)&get);
printf("%d", g.town);
getchar();
return 0;
}catch (DbException &e){
printf("%s", e.what());
getchar();
}
溶液
创建一种“序列化器”,将所有POD转换为void *,然后将这些片段联合起来
PS或者我将用户重写为POD类型,一切都会好的,我希望。
添加
这很奇怪,但是......我将一个无内容的非pod对象转换为void *并返回(它内部有std :: string)并且它没有问题(没有将它发送到db并返回)。怎么会这样?并且在我投射并发送'trough'db defenetly pod对象(没有额外的方法,所有成员都是pod,它是一个简单的结构{int a; int b; ...})我得到了污点。我的方法出了什么问题?
首先添加'添加'
后大约一周该死的......我已经把它编成了一些,只是为了看看它返回的是哪种污垢哦!没关系!......我做不到! ...... AAh!......主...一个合理的问题(在99.999%的情况下,正确答案是'我',但......这里......) - 这是谁的错?我或VS?
答案 0 :(得分:7)
除非User
是POD,否则这在C ++中是未定义的。
查看db_cxx.h,您是不是应该拨打get_doff()
,get_dlen()
和get_data()
或Dbt
上的内容,而不仅仅是投放(并将其分配给用户类型?
答案 1 :(得分:1)
由于没有检查put()的返回值,很可能会出现阻止更新的错误。 The documentation表示相当多的错误条件:
答案 2 :(得分:1)
你几乎绝对不应该直接向用户投射'get'。相反,提取您存储的数据然后转换它。除非您与我们分享Dbt的定义,否则我们无法确定。根据我们可以看到的内容进行猜测:
datab->get(txn, &key, &get, 0);
void* data = get.get_data();
User g = *((User*)data);
告诉我们更多有关Dbt的信息,我们可以帮助您解决更多问题。
答案 3 :(得分:0)
我会做这样的事情:
User user;
std::stringstream dbStotrStream;
dbStoreStream << user; // Serialize user
std::string dbStore(bdStoreStream.str());
value.set_data(dbStore.c_str());
value.set_size(dbStore.lenght());
//// Put in DB
然后提取它看起来像这样:
//// Get from DB
std::string dbStore(get.get_data(),get.get_date() + get.get_size());
std::stringstream dbStoreStream(dbStore);
User outUser;
dbStoreStream >> outUSer;