首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何初始化用于获取的BerkeleyDB密钥-数据对?

如何初始化用于获取的BerkeleyDB密钥-数据对?
EN

Stack Overflow用户
提问于 2019-07-12 17:57:22
回答 1查看 62关注 0票数 0

我正在处理一个未维护的代码库中的一些问题,它使用了BerkeleyDB库(通过它的C++ API)。具体来说,我看到了以下代码:

代码语言:javascript
复制
Dbt dkey, ddata;

memset(&dkey, 0, sizeof(dkey));
memset(&ddata, 0, sizeof(ddata));

_storage_key_cursor->get( &dkey, &ddata, DB_NEXT );

if ( dkey.get_data() == NULL ) {
  // etc. etc.
}

现在,Dbt类是前向声明的--在我的/usr/include/db_cxx.h中声明,这意味着它不知道(至少编译器是这样)是可初始化的。事实上,我得到了:

代码语言:javascript
复制
../src/AM/WSMV.cpp: In member function ‘BDBPage* WSMV::getNextSKPage()’:
../src/AM/WSMV.cpp:126:32: warning: ‘void* memset(void*, int, size_t)’ clearing an object of type ‘class Dbt’ with no trivial copy-assignment; use assignment or value-initialization instead [-Wclass-memaccess]
   memset(&dkey, 0, sizeof(dkey));

ddata也是如此。

然而,这个memset‘to 0似乎有点习惯:BerkeleyDB参考指南这个例子中这样做。

那我该怎么办?

  • 禁止/忽略警告?
  • 以其他方式显式初始化或构造?
  • 根本不初始化,把它留给默认的初始化?
EN

回答 1

Stack Overflow用户

发布于 2019-07-12 18:06:02

我最好的猜测是:

类Dbt是从( type ) DBT类型继承的--私有继承,DBT类型是struct __db_dbt的typedef。其定义是:

代码语言:javascript
复制
struct __db_dbt {
        void *     data;
        u_int32_t  size;
        u_int32_t  ulen;
        u_int32_t  dlen;
        u_int32_t  doff;
        void *     app_data;
        u_int32_t  flags;
};

标志值为0,表示没有设置标志。这至少意味着memset()并不是立即和明显有害的。我可以重新解释-强制转换为一个struct __db_dbt,并手动设置一些字段,但我不确定要设置哪些字段。另外-我不确定那些没有API函数的函数是否可以安全地设置为0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57011942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档