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

Segmentation fault while declaring an iterator in c++ example of leveldb

我试图对我的 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;
}

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

您应该将代码更改为:

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