在 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()
是 false
,db
是 NULL
,或者处于迭代或其他操作不起作用的状态。
您应该将代码更改为:
if (!s.ok()) {
cerr << s.ToString() << endl;
return -1;
}
我试图对我的 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()
是 false
,db
是 NULL
,或者处于迭代或其他操作不起作用的状态。
您应该将代码更改为:
if (!s.ok()) {
cerr << s.ToString() << endl;
return -1;
}