Ошибка сегментации при объявлении итератора в c ++ на примере leveldb - PullRequest
0 голосов
/ 19 мая 2018

Я пытался применить итерацию к моему файлу 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 голосов
/ 19 мая 2018

Не знаком с leveldb API, но вы используете db независимо от того, s.ok() равно true или false.Я бы предположил, что если s.ok() равно false, db равно либо NULL, либо находится в состоянии, при котором итерация или другие операции не будут работать.

Вам следует изменить код на:

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