首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GDBM顺序访问: bug?

GDBM顺序访问: bug?
EN

Stack Overflow用户
提问于 2012-05-31 07:21:18
回答 2查看 245关注 0票数 1

我实现了以下GBDM示例:

代码语言:javascript
复制
#include <boost/lexical_cast.hpp>
#include <gdbm.h>
#include <iostream>
#include <string>
#include <string.h>

struct record
{
    int a;
    int b;
};

int main(int argc, char* argv[])
{
    GDBM_FILE db;

    db = gdbm_open("gdbm.db", 512, GDBM_WRCREAT | GDBM_NOLOCK | GDBM_SYNC, 0664, NULL);

    datum lekey;
    datum levalue;
    for (int i = 0; i < 10; ++i) {
        record r;
        r.a = i;
        r.b = i + 1;
        lekey.dptr = (char*) boost::lexical_cast<std::string>(i).c_str();
        lekey.dsize = strlen(lekey.dptr) + 1;
        levalue.dptr = (char*) &r;
        levalue.dsize = sizeof(record);
        gdbm_store(db, lekey, levalue, GDBM_INSERT);
    }
    gdbm_sync(db);

    for(lekey = gdbm_firstkey(db);
        lekey.dptr != NULL;
        lekey = gdbm_nextkey(db, lekey)) {
        levalue = gdbm_fetch(db, lekey);
        record* r = (record*) levalue.dptr;
        if (r) {
            std::cout << lekey.dptr << " " << r->a << " " << r->b << std::endl;
            free(levalue.dptr);
        }
    }

    gdbm_close(db);

    return 0;
}

输出如下:

代码语言:javascript
复制
$ ./gdbm_example 
3 3 4
6 6 7
2 2 3
9 9 10
5 5 6
1 1 2
8 8 9
4 4 5

为什么0 0 17 7 8会被遗漏?这是一个bug,还是我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-31 13:58:40

问题可能出在下面这一行:

代码语言:javascript
复制
lekey.dptr = (char*) boost::lexical_cast<std::string>(i).c_str();

它存储指向临时变量的指针,因此也存储未定义的行为。

键不一定是字符串,也可以是数字,所以你可以使用:

代码语言:javascript
复制
lekey.dptr = &i;
lekey.dsize = sizeof(i);
票数 1
EN

Stack Overflow用户

发布于 2012-05-31 14:36:40

Joachim是对的,在这里使用boost::lexical_cast是不合适的。使用以下命令重写您的示例:

代码语言:javascript
复制
std::string s;
std::stringstream str;
str << i;
s = str.str();
lekey.dptr = (char*) s.c_str();

它将会像预期的那样工作。

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

https://stackoverflow.com/questions/10825639

复制
相关文章

相似问题

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