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

标签 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();
}

解决方案

创建一种“序列化器”,它将所有 POD 转换为 void*,然后将这些片段 union 起来

PS 或者我将 User 重写为 POD 类型,我希望一切都会好起来的。

添加

这很奇怪,但是......我将一个非 pod 对象强制转换为 void* 并返回(它内部有 std::string)并且没问题(没有将它发送到 db 并返回)。怎么会这样?在我转换并发送“低谷”db defenetly pod 对象(没有额外的方法,所有成员都是 pod,它是一个简单的结构 {int a; int b; ...})后,我得到了一个脏的。我的方法有什么问题?

在第一次“添加”后大约一周添加

该死的...我编译了一些,只是为了看看它返回了哪种污垢,哦!没关系!...我不能! ... 啊!... 上帝... 一个合理的问题(在 99.999% 的情况下正确答案是“我的”,但是... 这里...) - 这是谁的错?我的还是 VS?

最佳答案

除非 UserPOD这在 C++ 中是未定义的。

编辑:

查看db_cxx.h ,难道你不应该调用 get_doff()get_dlen()get_data() 或者 Dbt 而不是将其强制转换(并分配)到用户类型?

关于C++:强制转换为 void* 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2103873/

相关文章:

c++ - 如何注入(inject)从文件加载的shellcode?

java - 推荐一个快速且可扩展的持久化 Map - Java

C (gcc) 警告 : initialization from incompatible pointer type when calling pthread_cleanup_push()

c - void 指向结构的指针导致错误 'dereferencing ' void *' pointer'

c++ - cudaStream_t 有多大?

c++ - 为什么QProcess::readAllStandardOutput不读取所有输出 channel ?

c++ - 在 C++ 中使用 vector 的糟糕性能

c++ - 模板参数推导是否考虑了返回类型?

java - 伯克利数据库 GAE