在leveldb的c ++示例中声明迭代器时出现分段错误

时间:2018-05-19 03:55:25

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

我试图将迭代应用到我的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;
}

1 个答案:

答案 0 :(得分:0)

不熟悉leveldb API,但无论dbs.ok()还是true,您都在使用false。我假设如果s.ok()false,则dbNULL,或处于迭代或其他操作无法运行的状态。

您应该将代码更改为:

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