C++:转换为void*并返回

Ben*_*man 3 c++ berkeley-db void-pointers

*---编辑 - 现在整个过程*

当我在最后调试它时,"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();
}
Run Code Online (Sandbox Code Playgroud)

创建一种"序列化器",将所有POD转换为void*,然后将这些片段联合起来

PS或者我将用户重写为POD类型,我希望一切都会好的.

这很奇怪,但是......我将一个非自然的非pod对象转换为void*并返回(它内部有std :: string)并且它没有问题(没有将它发送到db并返回).怎么会这样?并且在我投射并发送'trough'db defenetly pod对象(没有额外的方法,所有成员都是pod,它是一个简单的结构{int a; int b; ...})我得到了污点.我的做法有什么问题?

首次'添加'后大约一周添加

该死的......我已经把它编成了一些,只是为了看看它返回哪种污垢哦!没关系!......我做不到!...... AAh!......主...一个合理的问题(在99.999%的情况下,正确答案是'我',但......这里......) - 这是谁的错?我的还是VS?

Nik*_*sov 7

除非UserPOD,否则这在C++中是未定义的.

编辑:

纵观db_cxx.h,你不应该做的通话get_doff(),get_dlen()以及get_data()什么对Dbt不只是投放(和分配),它给用户的类型?

  • @Mlnner:仅仅因为它编译并不意味着行为被定义. (12认同)
  • 正确...如果User是一个包含方法,构造函数等的类,你不能只是将它作为一个简单的数据转储到数据库,你需要编写逻辑来处理"序列化"和"反序列化"它. (3认同)