我应该如何初始化BerkeleyDB密钥数据对以获取?

时间:2019-07-12 17:57:22

标签: compiler-warnings berkeley-db database-cursor

我正在使用BerkeleyDB库(通过其C ++ API)在无需维护的代码库中解决一些问题。具体来说,我看到以下代码:

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中进行了前向声明,这意味着-至少对于编译器而言,它不知道像这样可以初始化。确实,我得到了:

../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相同。

但是,似乎将此记忆设置为0有点习惯:BerkeleyDB Reference Guidethis example中这样做。

那我该怎么办?

  • 抑制/忽略警告?
  • 以其他方式明确初始化或构造吗?
  • 根本不初始化,而将其保留为默认初始化吗?

1 个答案:

答案 0 :(得分:0)

我最好的猜测:

class Dbt私有地继承自(C API)DBT类型,该类型是struct __db_dbt的typedef。其定义是:

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。