gpt4 book ai didi

c++ - LevelDB 在删除 LevelDB 实例时断言

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:27 25 4
gpt4 key购买 nike

当我尝试删除 leveldb 实例时,我得到了一些非常烦人的断言,我不确定为什么会这样!

断言发生在 version_set.cc 中文件:

void VersionSet::AppendVersion(Version* v) {
// Make "v" current
assert(v->refs_ == 0); // <---??? how do I avoid this assertion?
// the rest of the source code is available in the link to version_set.cc
}

此外,它在同一个文件的另一个地方断言:

Version::~Version() {
assert(refs_ == 0); // <-- Again... how do I avoid this one too?
// the rest of the source code is available in the link to version_set.cc
}

这是我系统中使用情况的更多背景详细信息,我有一个:

  • ExtStorage 类(扩展存储),它有一个 LevelDB::DB 实例。
  • EextStorageDotNet 类,它是 ExtStorage 的 C++/CLI 包装器。
  • class AltStorage,它包含一个指向 ExtStorage 类的指针(通过构造函数传递):
  • AltStorageDotNet 类,它是 AltStorage 的 C++/CLI 包装器。

备用存储类如下所示:

class AltStorage{
ExtStorage* instance;
public:
AltStorage(ExtStorage* extStorage):instance(extStorage){}

~AltStorage(){
delete instance;
instance = NULL;
}
};

ExtStorage 类如下所示:

class ExtStorage{
leveldb::DB* mydb;
public:
ExtStorage(/*some parameters*/){
mydb = new leveldb::DB(/*parameters*/);
}

// Destructor
~ExtStorage() {
Close();
}

// deletes the leveldb::DB instance
void Close() {
if(mydb == NULL) {
delete mydb; // <-- Asserts every time I get here when using with the AltStorageDotNet
mydb= NULL;

// Close the L1 and L2 caches
// only once (
}
}
}

AltStorageDotNet 类如下所示:

public ref class AltStorageDotNet{
AltStorage* altInstance;
ExtStorageDotNet^ extInstance;
public:
AltStorageDotNet() {
ExtStorage extStorage = new ExtStorage(/*params*/);
altInstance = new AltStorage(extStorage);
extInstance = gcnew ExtStorageDotNet(extStorage);
}

~AltStorageDotNet(){
delete altInstance;
altInstance = NULL;
// no need to delete extInstance since it was created with gcnew
}

!AltStorageDotNet(){
delete altInstance;
altInstance = NULL;
// no need to delete extInstance since it was created with gcnew
}

inline ExtStorageDotNet^ GetExtInstance(){return extInstance;}
};

DotNet 包装器如下所示:

public ref class ExtStorageDotNet{
private:
ExtStorage* instance;
public:
ExtStorageDotNet(ExtStorage* extStorage){
instance = extStorage;
}

~ExtStorageDotNet(){
delete instance;
instance = NULL;
}

!ExtStorageDotNet(){
delete instance;
instance = NULL;
}

void Close(){instance->Close();}
};

每当我在我的 C# 应用程序中使用 ExtStorageDotNet 包装器时,一切正常,并且没有断言。但是,当我使用 AltStorageDotNet 包装器并访问 ExtStorageDotNet 包装器时,我会在关闭数据库时得到断言。 这是测试套件的所有部分,我在其中为每个测试用例初始化一个实例,并在每个测试用例结束后关闭它;在新的测试用例开始之前,关联的数据库文件会被删除。我看不出有任何理由会发生这种情况,而且断言对追踪问题没有帮助。

最佳答案

我去掉了嵌套引用,但这并没有解决问题。事实证明,导致这个问题的原因并不完全是我所看到的。当用户获取数据库的迭代器并且未能在删除数据库之前删除迭代器时,就会出现此问题。这在 google group relating to level db 中进行了讨论。 .

// Caller should delete the iterator when it is no longer needed.
// The returned iterator should be deleted before this db is deleted.
virtual Iterator* NewIterator(const ReadOptions& options) = 0;

当用户获得迭代器时,他们应该在删除数据库之前删除它,否则他们将得到上面提到的断言。

关于c++ - LevelDB 在删除 LevelDB 实例时断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7100634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com