Ошибка сегментации при объявлении итератора в примере C++ 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;
}

Вы уверены, что db не является NULL после звонка на leveldb::DB::Open?

Increasingly Idiotic 19.05.2018 08:09

на самом деле я только что обнаружил, что это NULL, но я не знаю почему, потому что файл физически существует в моем / tmp

MadHer 19.05.2018 14:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
231
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

на самом деле вы правы, после добавления этого возврата -1 я не получил ошибку сегментации, но получил этот «Недействительный аргумент: / tmp / userDb: exists (error_if_exists is true)», потому что ясно, что программа завершилась возвратом -1, в чем может быть причина, по вашему мнению, сэр? Я не понимаю, почему указатель базы данных не работает, когда он физически существует в моих папках

MadHer 19.05.2018 14:17

@MadHer - Разве API, который вы используете, не имеет функции, возвращающей дополнительную информацию об ошибке? API, просто возвращающий true или false, не будет казаться надежным - должна быть дополнительная функция, которую вы бы вызывали для получения дополнительной информации, как только вы получите возвращаемое значение ошибки.

PaulMcKenzie 19.05.2018 14:28

@PaulMcKenzie на самом деле нет, кроме s.ToString, я знаю, что проблема связана с db, потому что он существует, когда вы используете в первый раз, нет prblm (время создания), когда вы пытаетесь его открыть и для применения некоторых обновлений он больше не работает

MadHer 19.05.2018 15:03

@MadHer, у сообщения есть все, похоже, он жалуется, что база данных уже существует. Это происходит потому, что для options.error_if_exists установлено значение true. Установите его на false, если это имеет смысл и не будет перезаписывать его.

Horia Coman 19.05.2018 15:20

@HoriaComan Я установил для него значение false и на самом деле предполагаю, что он работает, потому что больше нет ошибок о существовании db, спасибо за помощь, я обновлю его больше

MadHer 19.05.2018 17:57

Другие вопросы по теме