【问题标题】:Segmentation fault while declaring an iterator in c++ example of leveldb在 leveldb 的 C++ 示例中声明迭代器时出现分段错误
【发布时间】:2018-10-29 12:04:35
【问题描述】:

我试图对我的 leveldb 文件应用迭代,但不幸的是我无法得到结果。我面临的问题是使用迭代器指针时出现分段错误。我使用了 gdb 我发现问题出在这条线上

leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());

(我在此文件 /tem/userDb 之前添加了一些值,并且添加效果很好。)

#include <assert.h>
#include <leveldb/db.h>
#include <iostream>
#include <sstream>
using namespace std;

void iteration(leveldb::DB* db)
{
    leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next())
    {
        cout << "key :" << it->key().ToString() << " : "
             << "value:" << it - > value().ToString() << endl;
    }
    if (false == it->status().ok())
    {
        cerr << "An error was found during the scan" << endl;
        cerr << it->status().ToString() << endl;
    }
    delete it;
}

int main(int argc, char *argv[])
{
    leveldb::DB* db;
    leveldb::Options options;

    options.create_if_missing = true;

    // erase error if the database exists
    options.error_if_exists = true;
    leveldb::Status s = leveldb::DB::Open(options, "/tmp/userDb", &db);
    if (!s.ok()) 
        cerr << s.ToString() << endl;
    iteration(db);
    delete db;
}

【问题讨论】:

  • 你确定db在调用leveldb::DB::Open后不是NULL吗?
  • 其实我只是发现它的 NULL ,但我不知道为什么,因为该文件物理存在于我的 /tmp

标签: c++ iterator segmentation-fault leveldb sstream


【解决方案1】:

不熟悉leveldb API,但无论s.ok()true 还是false,您都在使用db。我假设如果s.ok()falsedb 要么是NULL,要么处于迭代或其他操作不起作用的状态。

您应该将代码更改为:

if (!s.ok()) {
    cerr << s.ToString() << endl;
    return -1;
}

【讨论】:

  • 其实你是对的,在加上那个 return -1 之后,我没有得到分段错误的错误,而是得到这个“无效参数:/tmp/userDb:存在(error_if_exists 为真)”,因为它很明显,程序以返回 -1 结束,先生您认为是什么原因?我不明白为什么 db 的指针在我的文件夹中物理存在时不起作用
  • @MadHer -- 您使用的 API 不会有返回更多错误信息的功能吗?仅返回 truefalse 的 API 听起来并不可靠——一旦获得失败返回值,您应该调用一个额外的函数来获取更多信息。
  • @PaulMcKenzie 实际上没有,除了 s.ToString ,我知道问题出在 db 因为它存在,当你第一次使用时没有 prblm (创建时间),当您尝试打开它并应用一些更新时,它不再工作了
  • @MadHer 消息似乎都在抱怨数据库已经存在。这样做是因为 options.error_if_exists 设置为 true。如果有意义并且不会覆盖它,请将其设置为 false
  • @HoriaComan 我将它设置为 false ,实际上猜测它的工作,因为没有更多关于 db 存在的错误,感谢您的帮助,我会更新它
猜你喜欢
  • 2021-09-03
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2016-06-03
  • 2017-10-10
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
相关资源
最近更新 更多